は、私は次のコードが適切に先頭と末尾のゼロを削除しないだろうと思ったが、それはありません:なぜこのコードは適切に機能していますか?
(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回反転しているので、逆のリスト(ゼロなし)出力されますが、非反転リストは出力に表示されます。説明の瑕疵はどこにありますか?
を実行するように動作しません。これは突然変異と再帰を組み合わせたもので、これは理由の不一致の組み合わせです。リンクしたものは純粋に機能的です。 – molbdnilo
私は、そのリンクに欠陥があることを見つけた後、そのコードを変更しました。私は私の質問からリンクを削除しました。見落としを指摘してくれてありがとう。 – rnso