2016-07-03 9 views

答えて

2

またはそれ以上の明示的:

(define (reverse xs) 
    (let loop ((pend xs) 
       (res '())) 
     (if (null? pend) 
      res 
      (loop (cdr pend) (cons (car pend) res))))) 

クリス答えはもっときちんとしていないと、(様々な理由のために)より良いWRTのパフォーマンスすることができます。 質問の第2の部分として、常に可能です。つまり、すべての機能をテール再帰的に行うことができます(機械的に実行できるcpsに変換するなど)。

+1

もちろん、本当に再帰的で、CPS変換を介してテール再帰的になる関数は、「無制限の末尾再帰が無制限のメモリ消費をもたらさない」という適切な末尾再帰の要件を実際に満たしません。 ;-) –

2

はい。実際にreverseの標準実装は完全にテール再帰的です。

(define (reverse xs) 
    (fold cons '() xs)) 

foldを使用しないでください。いいえ問題:

(define (reverse xs) 
    (do ((result '() (cons (car xs) result)) 
     (xs xs (cdr xs))) 
     ((null? xs) result))) 
+1

すべてのスキームに折り畳みが組み込まれているわけではないので、srfi-1にあります。明らかにこれは左折です。 – dercz

関連する問題