0

誰でもこれで私を助けてくれますか?

(define f (lambda (x)
  (cond
    ((null? x) 0)
    (#t (+ (* (car x) (car x)) (f (cdr x)))))))

この関数が末尾再帰かどうかわかりませんでしたか? もしそうなら、その理由は何ですか?

4

1 に答える 1

4

関数が戻る前に最後に行うことは evaluate であるため、末尾再帰ではありません(+ ...)。末尾再帰にするためには、戻る前の最後の操作を再帰呼び出しにする必要があります。

通常、関数の末尾を再帰的にするには、アキュムレータ パラメーターを受け取るヘルパー関数が必要です。

(define f0 (lambda (x acc)
  (if (null? x)
      acc
      (f0 (cdr x) (+ acc (* (car x)(car x)))))))

(define f (lambda (x)
  (f0 x 0)))
于 2013-07-29T21:31:54.843 に答える