在Scheme中编写递归枚举函数

时间:2011-08-27 00:24:33

标签: algorithm recursion scheme lisp enumeration

我正在写一个递归枚举函数,我在某个地方遇到了一个简单的错误。

以下是应该发生的事情:

(enum 1 0.5 2.5)  
> (1.0 1.5 2.0 2.5)

以下是代码:

(define enum
   (lambda (start step stop)
      (if (not (<= stop start))
          (cons start (enum (+ start step) step  stop))
          ('(stop))
          )))

编辑:
我得到的错误(来自Impromptu(http://impromptu.moso.com.au/))是:

> (print (enum 0 0.5 2.5))  
:ERROR: position:(0) in function "enum"  
illegal function  
Trace: enum  

1 个答案:

答案 0 :(得分:5)

我相信你的问题在行

('(stop))

我认为你有正确的想法,你想要在结束后停止执行递归,但这不是这样做的方法。因为你把它放在双括号中,这被解释为“评估'停止',然后尝试将其作为一个函数调用。”但是,stop不是函数,因此是错误。

要解决此问题,如果您想将返回值设为仅包含stop的列表,请使用list函数:

(define enum
   (lambda (start step stop)
      (if (not (<= stop start))
          (cons start (enum (+ start step) step  stop))
          (list stop)
          )))

请注意,list stop周围只有一组括号。

希望这有帮助!