以列表为输入并输出函数的方案中的函数
Function in scheme that takes list as an input and outputs a function
我正在尝试创建一个将列表作为输入并输出一个函数的函数。我对遍历列表必须进行的递归调用感到困惑。
(define S ( buildfunc '(1 0 -2 -3 4) ) )
例如:
将生成一个函数,该函数将整数和
作为输入
- 加1
- 对结果进行平方
- 将平方乘以 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))
嗯。以下是我将如何解决这个问题:
(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))))))
我正在尝试创建一个将列表作为输入并输出一个函数的函数。我对遍历列表必须进行的递归调用感到困惑。
(define S ( buildfunc '(1 0 -2 -3 4) ) )
例如: 将生成一个函数,该函数将整数和
作为输入- 加1
- 对结果进行平方
- 将平方乘以 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))
嗯。以下是我将如何解决这个问题:
(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))))))