2017-05-24 7 views
-2

私は最近、テール再帰について、あなたが扱う数値が大きすぎるとクラッシュしない再帰を作る方法として学びました。私は簡単にwhileループとしてテール再帰を書き直して、それが基本的にまったく同じことをすることができることに気づきました。私は、通常のループですべてを行うことができる再帰の使用はありますか?再帰のための使用はありますか?

はい、再帰コードは小さく見え、分かりやすくなりますが、完全なクラッシュの可能性もありますが、単純なループでは同じタスクを実行するとクラッシュすることはありません。

+0

ようこそStackOverflow。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [on topic](http://stackoverflow.com/help/on-topic)および[How to Ask](http://stackoverflow.com/help/how-to-ask)をここで適用してください。 この質問には、スタックオーバーフローと一般的なインターネットに関する多くの回答があります。 – Prune

+2

ループの用途はありますか?ループはすべてのことを再帰で行うことができます。単純なループは、範囲外のインデックスや整数のオーバーフローによってクラッシュする可能性がありますが、プログラマはコードがクラッシュしないことを確認する責任を負いません! – MrZander

+0

@Prune私はそれらのどれも役に立たなかったと思った。 – umnikos

答えて

0

私は例えばHaskell languageを取るよ、それは純粋に機能です:

ハスケルのすべての機能は、数学的な意味 (すなわち、「純粋」)内の関数です。副作用のIO操作でさえ、純粋なコードによって行われる処理についての説明は です。 ステートメントや命令はありません。 変数(ローカルまたはグローバル)に変更することはできません。また、時間またはランダムな のような状態にアクセスすることはできません。

再帰呼び出しの最終結果は、関数自体の最終的な結果であれば、Haskellで再帰関数は末尾再帰です。再帰呼び出しの結果が の場合は、さらに処理する必要があります(たとえば、 1を追加するか、別の要素をその先頭に追加する)、末尾再帰ではない です。 (see here

一方、多くのプログラミング言語では、関数を呼び出すとスタックスペースが使用されるため、テール再帰関数は大きなメモリスタックを構築し、メモリを浪費します。テールコールでは、包含する関数が返されようとしているので、その環境を実際に破棄することができ、新しいスタックフレームを作成せずに再帰呼び出しを入力することができます。このトリックは、テールコール除去またはテールコール最適化と呼ばれ、テール再帰関数を無限に繰り返すことを可能にします。

+0

問題に関する新しい情報はありません。私は現在lispを学んでおり、標準的なループと末尾再帰の両方の最適化があります。私は、通常のループが関数を宣言せずに全く同じ仕事をしているときに、テール再帰を使う理由を見つけようとしています。 – umnikos

+1

あなたはループを使ってハノイの塔を解決しようとしましたか? – Nykros

+0

それは素晴らしい例です@Nykros、多くの方法で、尾の再帰を読んで理解するのがはるかに簡単で、時には高速です –

関連する問題