方案:功能援助

时间:2013-03-26 23:32:48

标签: scheme

我对Scheme很新,我想到了一种方法来递归地复制给定列表中的每个数字到目前为止这就是我所拥有的:

(define (cube-it-list lst)
  (cond [(empty? lst) empty]
        [else (cons (cube-it (first lst)) 
                    (cube-it-list (rest lst)))]))

但每次执行程序时都会出现错误,我不确定为什么有人可以帮助或提出更有效的方法来执行此操作。

2 个答案:

答案 0 :(得分:2)

该功能看起来很好,可能问题出在cube-it程序或你调用它的方式。例如,这有效:

(define (cube-it x)
  (* x x x))

(define (cube-it-list lst)
  (cond
    [(empty? lst)
     empty]
    [else
     (cons (cube-it (first lst))
           (cube-it-list (rest lst)))]))

(cube-it-list '(1 2 3 4 5))
=> '(1 8 27 64 125)

至于“更有效的方法”,坚持@ svk的答案和map在输入列表上,这是解决这类问题的惯用方法,包括将函数应用于每个输入列表中的元素,用于生成包含结果的输出列表:

(map cube-it '(1 2 3 4 5))
=> '(1 8 27 64 125)

答案 1 :(得分:1)

你有没有定义函数cube-it?当我这样做时,你的代码对我有用。

在任何情况下,Scheme中都有一个构造用于这种事情:通过对每个元素应用转换,使一个列表从另一个列表中生成。它被称为地图:

(map cube-it '(1 2 3 4 5))
=> '(1 8 27 64 125)

你基本上在这里重新发明了它,除了map不仅限于单个转换操作 - 你将它想要用作第一个参数的函数传递给它。

(注意,如果你被特别告知要实现递归解决方案,你应该坚持使用原始代码.map将在内部使用递归,但使用map意味着你自己的代码没有需要涉及这种情况的任何递归。)