我应该编写一个递归函数,将另一个函数应用于一组连续的整数并返回一个列表。如果开始是>而不是停止,我只是应该返回一个空集。
这就是我所拥有的。我不确定这是解决问题的最佳方案,但是......
(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>)
我能做些什么来摆脱虚空的事情?我有点困惑。
答案 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?