gpt4 book ai didi

scheme - 递归函数接受方案中的列表

转载 作者:行者123 更新时间:2023-12-04 02:49:48 26 4
gpt4 key购买 nike

我是 Scheme 的新手,这是我的第一门函数式语言。递归地实现几乎所有的东西对我来说似乎很尴尬。然而,能够实现具有单个整数输入的阶乘和斐波那契问题的函数。

但是,如果您的函数有一个列表输入怎么办?假设这个练习:

FUNCTION: ret10 - extracts and returns as a list all the numbers greater than 10 that are found in a given list, guile> (ret10 ‘(x e (h n) 1 23 12 o)) OUTPUT: (23 12)

我应该将 (define c(list)) 作为函数的参数吗?还是有其他办法?

请帮忙。谢谢!


下面是我根据 Óscar López 爵士的回答得出的解决方案。希望这对其他人有帮助:

(define (ret10 lst)
(cond
((null? lst) '())

((and (number? (car lst)) (> (car lst) 10))
(cons (car lst)
(ret10 (cdr lst))))

(else (ret10 (cdr lst)))
)
)

最佳答案

这种您收到一个列表作为输入并返回另一个列表作为输出的问题有一个众所周知的解决方案模板。我首先建议您看一下 The Little SchemerHow to Design Programs ,这两本书都会教您开始思考解决方案的正确方法。

首先,我将向您展示如何解决类似的问题:完全原封不动地复制列表。这将展示解决方案的一般结构:

(define (copy lst)
(cond ((null? lst) ; if the input list is empty
'()) ; then return the empty list
(else ; otherwise create a new list
(cons (car lst) ; `cons` the first element
(copy (cdr lst)))))) ; and advance recursion over rest of list

现在让我们看看以上内容与您的问题有什么关系。显然,递归的基本情况是相同的。不同之处在于,我们cons第一个元素与列表的其余部分如果它是一个数字(提示:使用number?过程) 并且它大于10。如果条件不成立,我们只是推进递归,而不做任何事情。这是一般的想法,填空:

(define (ret10 lst)
(cond (<???> <???>) ; base case: empty list
(<???> ; if the condition holds
(cons <???> ; `cons` first element
(ret10 <???>))) ; and advance recursion
(else ; otherwise
(ret10 <???>)))) ; simply advance recursion

不要忘记测试它:

(ret10 '(x e (h n) 1 23 12 o))
=> '(23 12)

最后一点:通常您会使用 filter 过程解决此问题 - 该过程将一个列表作为输入并返回另一个列表作为输出,其中仅包含满足给定谓词的元素。在学习并理解如何“手动”编写解决方案之后,请查看 filter 并使用它编写解决方案,以比较不同的方法。

关于scheme - 递归函数接受方案中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18028743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com