3

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

然而,当你的函数有一个列表的输入时呢?假设这个练习:

功能: ret10 - 提取并以列表形式返回在给定列表中找到的所有大于 10 的数字,guile> (ret10 '(xe (hn) 1 23 12 o)) 输出:(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)))
    )
)
4

2 回答 2

4

这种你接收一个列表作为输入并返回另一个列表作为输出的问题有一个众所周知的解决方案模板。我首先建议您看一下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并使用它编写解决方案,只是为了比较不同的方法。

于 2013-08-03T02:55:37.157 回答
0

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

(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)
于 2013-08-04T00:28:48.437 回答