我正在尝试创建一个将列表作为输入并输出函数的函数。我对必须遍历列表的递归调用感到困惑。
(define S ( buildfunc '(1 0 -2 -3 4) ) )
例如: 将生成一个函数,该函数将整数和
作为输入如果(S 4)是输出函数,则结果为: 154
4 + 1 = 5 - > 25 - > 25 * 2 = 50 - > 50 * 3 = 150 - > 150 + 4 ==> 154
我目前使用的代码是:
(define (s n) (lambda (L) (buildfunc n L)))
(define (buildfunc n L)
(cond
((null? L) '())
((equal? (car L) 0) (* n n))
((positive? (car L)) (+ n (car L)))
((negative? (car L)) (* n (car L)))
(else
(buildfunc n (cdr L)))))
(define C (s 3))
(C '(1 0 -2 -3 4))
答案 0 :(得分:1)
嗯。以下是我要解决这个问题的方法:
(define (buildfunc cmds)
(define (process cmd value)
(cond ((zero? cmd) (* value value))
((positive? cmd) (+ value cmd))
((negative? cmd) (* value (- cmd)))))
(lambda (n)
(foldl process n cmds)))
使用示例:
> ((buildfunc '(1 0 -2 -3 4)) 4)
154
更新:您当然可以将foldl
展开到手动循环中,如下所示:
(define (buildfunc cmds)
(define (process cmd value)
(cond ((zero? cmd) (* value value))
((positive? cmd) (+ value cmd))
((negative? cmd) (* value (- cmd)))))
(lambda (n)
(let loop ((value n)
(cmds cmds))
(if (null? cmds)
value
(loop (process (car cmds) value) (cdr cmds))))))