以列表为输入并输出函数的方案中的函数

Function in scheme that takes list as an input and outputs a function

我正在尝试创建一个将列表作为输入并输出一个函数的函数。我对遍历列表必须进行的递归调用感到困惑。

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

嗯。以下是我将如何解决这个问题:

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