递归函数接受scheme中的列表

递归函数接受scheme中的列表,scheme,Scheme,我是Scheme的新手,这是我的第一个函数式语言。对我来说,递归实现几乎所有东西似乎都很尴尬。尽管如此,他还是能够实现具有单个整数输入的阶乘和斐波那契问题的函数 但是,当您的函数有一个列表输入时呢?假设这个练习: 函数:ret10-提取并以列表形式返回大于10的所有数字 在给定列表中找到的,guile>(ret10'(xe(hn)12312 o)) 输出:(23 12) 我是否应该将(定义c(list))作为此函数的参数?或者还有别的办法吗 请帮忙。谢谢 下面是我根据奥斯卡·洛佩斯爵士的回答得

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

但是,当您的函数有一个列表输入时呢?假设这个练习:

函数:ret10-提取并以列表形式返回大于10的所有数字 在给定列表中找到的,guile>(ret10'(xe(hn)12312 o)) 输出:(23 12)

我是否应该将(定义c(list))作为此函数的参数?或者还有别的办法吗

请帮忙。谢谢


下面是我根据奥斯卡·洛佩斯爵士的回答得出的解决方案。。希望这能帮助其他人:

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

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

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

这种类型的问题,您接收一个列表作为输入,并返回另一个列表作为输出,有一个众所周知的解决方案模板。我会首先推荐你看一看,或者,这两本书都会教你开始思考解决方案的正确方法

首先,我将向您展示如何解决一个类似的问题:复制列表,一模一样。这将演示解决方案的总体结构:

(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
现在,让我们看看上述内容与您的问题之间的关系。显然,递归的基本情况是相同的。不同的是,只有当列表中的第一个元素是一个数字(提示:使用
number?
过程)并且大于
10时,我们才
cons
第一个元素和其余元素。如果条件不成立,我们只需推进递归,而不考虑任何问题。以下是总体思路,请填空:

(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

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

解决列表第一个元素的问题和列表其余部分的递归问题。确保处理终止条件(列表为
null?
)并合并结果(
cons
append


哎呀。我的意思是大于10。很抱歉。编辑它。哇哦!!!谢谢你,奥斯卡先生!你是最棒的。感谢您让我自己发现代码,而不是马上破坏答案。呵呵。我更新了我的帖子,以支持我提出的解决方案。我希望它能帮助别人@伯恩兹永远是我的荣幸:)
(ret10 '(x e (h n) 1 23 12 o))
=> '(23 12)
(define (extract pred? list)
  (if (null? list)
      '()
      (let ((head (car list))
            (rest (cdr list)))
        (cond ((pred? head) (cons head (extract pred? rest)))
              ((list? head) (append (extract pred? head)
                                    (extract pred? rest)))
              (else (extract pred? rest))))))

(define (ret10 list)
  (extract (lambda (x) (and (number? x) (> x 10))) list))

> (ret10 '(0 11 (12 2) 13 3))
(11 12 13)