これは、ループ内の各繰り返しを関数呼び出しとして視覚化する限り、簡単です。それについて考えてみましょう。元のfor
ループは1
からlimit-1
までです。これは、limit-1
から開始し、各関数呼び出しで制限を1
減らし、0
に達したときに停止するのと同じです。
再帰的な手順を書いてWENを覚えておくべき二つの重要な事柄があります。
- 私たちはいくつかの点で停止していることを確認する必要があります - これはベースケースと呼ばれているが、この例では、元のループに
1
が含まれているため、0
に達したときに発生します。我々はに持って
- は、再帰を呼び出すときに、我々は一緒に取得部分的結果を組み合わせる:現在の数が
3
または5
で割り切れることを起こるならば、我々はそうでない場合、我々はそれを無視し、再帰呼び出しの残りの部分にそれを追加しますが、ベースケースに達するまで、とにかく再帰を進めてください。
これは私が何を意味するかです:
(define (sum-divisibles limit)
(cond ((= limit 0) 0) ; base case, stop recursion
((or (divides? limit 3) (divides? limit 5)) ; does the condition hold?
(+ limit ; then we add current value
(sum-divisibles (- limit 1)))) ; and advance the recursion
(else ; otherwise skip it
(sum-divisibles (- limit 1))))) ; and advance the recursion
あなたの元のコードにlimit
はが(反復が右に到達する前に停止した合計に追加されていないことを覚えて、初期limit
値に注意してくださいそれで、再帰的なバージョンを呼び出す同等の方法は次のとおりです。
(sum-divisibles (- n 1))
たとえば、と同じ値を取得するにはあなたのコードでは、我々は再帰バージョンでは、このようにそれを呼び出す必要があり:
(sum-divisibles 49)
=> 543
また、あなたが実際の再帰プロシージャを呼び出す前に1によって入力limit
を下げるの世話をするヘルパープロシージャを記述できますが、それはです読者のための練習として残しました。
@DataPoliceInc。これまたは他の回答があなたの質問を解決しましたか?もしそうなら、ポスターを奨励するために最高の答えを受け入れるか、またはアップアップすることを忘れないでください;) –
こんにちは、オスカー。あなたに説明してくれてありがとう。今私にはとても分かり、すべてを理解しています。今、あなたが言っている(N-1)ケースのヘルパー関数を作成しようとしています。 – DataPsycho