如何摆脱这个递归Scheme函数产生的#<void>?</void>

时间:2013-10-12 20:27:49

标签: recursion scheme

我应该编写一个递归函数,将另一个函数应用于一组连续的整数并返回一个列表。如果开始是>而不是停止,我只是应该返回一个空集。

这就是我所拥有的。我不确定这是解决问题的最佳方案,但是......

(define (myfunction start stop fn)
  (if (<= start stop)
      (cons (fn start)(myfunction (+ start 1) stop fn)))
 )

(define (foo val1) ; just to demonstrate myfunction
  (* val1 2))

当我尝试在方案解释器中使用它时,我得到了这个:

(myfunction 0 5 foo)
(0 2 4 6 8 10 . #<void>)

我能做些什么来摆脱虚空的事情?我有点困惑。

1 个答案:

答案 0 :(得分:3)

如果您这样做,请考虑会发生什么:

> (list (if #f 'then-value))
;=> (#<void>)

您的函数有if没有“其他”部分。

(define (myfunction start stop fn)
  (if (<= start stop)
      (cons (fn start)
            (myfunction (+ start 1) stop fn))
      ; missing something here
 ))

当{em>不 (<= start stop)的情况时,列表应该是什么?我猜测合理的默认值是空列表,因此最终调用值(myfunction (+ start 1) stop fn)start的{​​{1}}时stop大于start {1}},您获得空列表,以便stop有一个空列表作为其第二个参数:

(cons (fn start) (myfunction ...))

有关为什么输出为(define (myfunction start stop fn) (if (<= start stop) (cons (fn start) (myfunction (+ start 1) stop fn)) '())) (myfunction 0 5 (lambda (x) (* x 2))) ;=> (0 2 4 6 8 10) 的更多信息(即,为什么它最后得到了点),请查看this answer(免责声明:这是我的回答)Recursive range in Lisp adds a period?