2016-10-06 1 views
2

は、私は次のコードが適切に先頭と末尾のゼロを削除しないだろうと思ったが、それはありません:なぜこのコードは適切に機能していますか?

(define f 
    (λ (l) 
    (let loop()        ; 1 (code line no.) 
     (when (= 0 (first l))     ; 2 
     (set! l (rest l))     ; 3 
     (loop))        ; 4 
     (set! l (reverse l))     ; 5 
     (when (= 0 (first l)) (loop)))   ; 6 
    (reverse l)))       ; 7 

(f '(0 0 2 5 0 6 8 9 0 0 0)) 

出力:私は先頭のゼロを削除した後、リストはに逆転してしまいますと思っ

'(2 5 0 6 8 9) 
5行目。 6行目から1行目に戻り、末尾の0を削除します(これは、逆のリストになります)。その後、このリストは再び逆になり(2番目の行は5番目)、最終的に7番目の行でもう一度逆になります(3回目)。

リストが3回反転しているので、逆のリスト(ゼロなし)出力されますが、非反転リストは出力に表示されます。説明の瑕疵はどこにありますか?

+0

を実行するように動作しません。これは突然変異と再帰を組み合わせたもので、これは理由の不一致の組み合わせです。リンクしたものは純粋に機能的です。 – molbdnilo

+0

私は、そのリンクに欠陥があることを見つけた後、そのコードを変更しました。私は私の質問からリンクを削除しました。見落としを指摘してくれてありがとう。 – rnso

答えて

2

ループが復帰すると、プログラムは4行目以降も実行され続けることを覚えておく必要があります。これはループの各呼び出しで発生します。そう例の場合に8

しかし、あなたが正しいものであるれる先行ゼロと後続ゼロM reversen + 1 + m + 1 + 1 = n + m + 3と呼ぶことにするが(最後1プログラムの終了時に逆である)、nは存在する場合プログラムは、あなたが投稿したコードは、あなたがにリンクされているものではありません

(f '(0 0 2 5 0 6 8 9 0 0)) 

意志出力

'(9 8 6 0 5 2) 
+0

したがって、このコードは完全に正しいとは思わなかった。 – rnso

関連する問題