2016-04-05 24 views
0

listを入力として関数を出力する関数を作成しようとしています。私はリストをたどるために行わなければならない再帰呼び出しと混同しています。listを入力とし、関数を出力するschemeの関数

(define S (buildfunc '(1 0 -2 -3 4))) 

例:入力として整数と

  • をとる関数が生成される は、それに
  • 正方形
  • 2によって正方形を乗算した結果を、1を加算
  • その最後の結果に3を掛けて、
  • を加算し、4
  • (S 4)は出力関数である

場合、結果は次のようになります

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

うーん。ここで私はこれを解決するに取り掛かるだろう方法は次のとおりです。

(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 

更新:

(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)))))) 
:あなたは確かにそうよう、マニュアルループに foldlをアンロールすることができます
+0

'foldl'を使わずに関数を書く方法はありますか?私はスキームに慣れていないし、リストをたどる方法を理解しようとしている。 – Siva

関連する問題