0

我对Scheme相当陌生,并且我正在考虑一种方法来递归地对给定列表中的每个数字进行立方,这就是我所拥有的:

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

但是每次我执行程序时都会出错,我不确定为什么有人可以帮助或想出更好更有效的方法来做到这一点。

4

2 回答 2

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)
于 2013-03-27T00:03:31.460 回答
1

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

在任何情况下,Scheme 中都有一个结构正是为了这种事情:通过对每个元素应用转换来从另一个列表中创建一个列表。它被称为地图:

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

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

(注意,如果您被明确告知要实现递归解决方案,则应坚持使用原始代码。map 将在内部使用递归,但使用 map 意味着您自己的代码不需要在这种情况下涉及任何递归。)

于 2013-03-26T23:39:38.337 回答