4

次の変数関数があります(define doSomething (lambda (x . rest) ...。関数は、たとえば次のように数字を使用して呼び出されます(doSomething 1 2 3 4 5)(したがって、その呼び出しでxは と1restなります(2 3 4 5))。

2関数を再帰的に呼び出して 2 番目の数値 ( ) を入れようとすると、xどうにかrest(3 4 5)restパラメーターを list: のリストとして受け取ります((3 4 5))

これは私が現在関数を再度呼び出そうとする方法です: (+ x (doSomething (car rest) (cdr rest)))

私が使用していることは言及する価値がありPretty Bigます。アドバイスしてください、ありがとう。

4

1 に答える 1

2

したがって、最初の呼び出しで、残りとは何かを組み合わせて一致させています

(doSomething 1 2 3 4 5)   ; x = 1  rest = '(2 3 4 5)

その後の通話では、最終的に

(doSomething (car rest) (cdr rest))   ; x=2  rest = '((3 4 5))

なぜならrestは可変引数であるため、最初の引数の後のすべてを取りrest、それをあなたのために呼び出されるリストにするため、二重リストになります。applyおそらく、または何かを使用したいと思うでしょう。つまり、次のようなものです。

(define doSomething (lambda (x . rest) 
                      (display x) 
                      (if (not (null? rest))
                        (apply doSomething rest)
                        #f)))
于 2012-10-30T13:28:02.310 に答える