0

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

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

(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>)

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

4

1 回答 1

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
 ))

如果不是这种情况,列表应该是什么(<= start stop)?我猜想一个合理的默认值应该是空列表,因此当(myfunction (+ start 1) stop fn)最终使用 和 的值调用时startstopstartstop得到空列表,因此(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)

有关为什么输出是(<elements> . #<void>)(即为什么它在末尾有点)的更多信息,请查看这个答案(免责声明:这是我的答案)到Lisp 中的递归范围添加一个句点?.

于 2013-10-12T20:39:23.177 回答