方案中的函数,将列表作为输入并输出函数

时间:2016-04-05 06:02:13

标签: scheme racket

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

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

1 个答案:

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