タグ付けされた質問 「recursion」

再帰に関する質問については、メソッドまたは関数をそれ自体から呼び出す方法。

11
ループではできない再帰でできることはありますか?
再帰を使用するほうがループを使用するよりも優れている場合と、ループを使用する方が再帰を使用するよりも優れている場合があります。「正しい」ものを選択すると、リソースを節約したり、コードの行数を減らすことができます。 ループではなく再帰を使用してのみタスクを実行できる場合はありますか?
126 recursion  loops 

8
再帰またはwhileループ
私はいくつかの開発面接の実践、特に面接で尋ねられた技術的な質問とテストについて読んでいて、ジャンルのことわざに何度かつまずいてきました。「問題はwhileループで解決しました。 「再帰」または「誰でも100行のwhileループでこれを解決できますが、5行の再帰関数でそれを実行できますか?」等 私の質問は、再帰はif / while / for構造より一般的に良いですか? 私はいつも、再帰は優先されるべきではないと考えてきました。なぜなら、それはヒープよりもはるかに小さいスタックメモリに制限されているためです間違っている...

5
Javaに末尾再帰の最適化がないのはなぜですか?
私が読んだことから:理由は、継承があるためにどのメソッドが実際に呼び出されるかを決定するのは簡単ではないからです。 しかし、なぜJavaには少なくとも静的メソッドの末尾再帰最適化がなく、コンパイラで静的メソッドを呼び出す適切な方法を強制しないのですか? Javaが末尾再帰をまったくサポートしないのはなぜですか? ここに問題があるかどうかはまったくわかりません。 JörgW Mittag 1が説明したように、提案された複製について: もう1つの質問は、TCOに関する質問です。これはTREに関する質問です。TREはTCOよりもはるかに単純です。 また、別の質問では、JVMがJVMにコンパイルしたい言語実装にどのような制限を課しているのかを尋ねます。この質問は、JVMによって制限されないJavaについて質問します。 Javaを設計する同じ人々。 最後に、JVMにはメソッド内GOTOがあり、TREに必要なのはそれだけであるため、JVMにはTREに関する制限さえありません。 1作成されたポイントを呼び出すためにフォーマットが追加されました。

18
平易な英語では、再帰とは何ですか?
再帰の考え方は、現実の世界ではあまり一般的ではありません。そのため、初心者のプログラマにとっては少し混乱するようです。とはいえ、彼らは徐々にコンセプトに慣れてくると思います。だから、彼らがアイデアを簡単に把握するための良い説明は何ですか?
74 recursion 

3
再帰とコアカーソルの違いは何ですか?
これらの違いは何ですか? 再帰 コアカージョン ウィキペディアでは、これらの用語を説明する情報はほとんどなく、明確なコードもありません。 これらの用語を説明する非常に簡単な例は何ですか? corecursionはどのように再帰の二重ですか? 古典的なcorecusiveアルゴリズムはありますか?

17
階乗、フィボナッチ数などのない再帰
再帰について見つけることができるほぼすべての記事には、階乗またはフィボナッチ数の例が含まれています。 数学 実生活では役に立たない 再帰を教えるための興味深い数学以外のコード例はありますか? 私は分割統治アルゴリズムを考えていますが、通常は複雑なデータ構造を伴います。
48 recursion 

8
再帰アルゴリズムでスタックオーバーフローを回避するための方法は何ですか?
質問 再帰アルゴリズムによって引き起こされるスタックオーバーフローを解決する可能な方法は何ですか? 例 Project Eulerの問題14を解決しようとしていますが、再帰アルゴリズムを使用して試してみることにしました。ただし、プログラムはjava.lang.StackOverflowErrorで停止します。分かりました。非常に大きな数のCollat​​zシーケンスを生成しようとしたため、アルゴリズムは実際にスタックをオーバーフローさせました。 解決策 だから私は疑問に思っていました:あなたの再帰アルゴリズムが正しく書かれており、常にスタックをオーバーフローさせると仮定して、スタックオーバーフローを解決するための標準的な方法は何ですか?思いついた2つの概念は次のとおりです。 末尾再帰 繰り返し アイデア(1)と(2)は正しいですか?他のオプションはありますか? 編集 できればJava、C#、Groovy、またはScalaでコードを表示すると役立ちます。 おそらく上記のプロジェクトオイラーの問題を使用しないでください。そうすれば、他の人にとっては甘やかされることはありませんが、他のアルゴリズムを使用できます。階乗かもしれない、または似たようなもの。

8
関数型言語は再帰に優れていますか?
TL; DR:関数型言語は、非関数型言語よりも再帰をうまく処理しますか? 現在、コードコンプリート2を読んでいます。本のある時点で、著者は再帰について警告しています。彼は、可能な場合は避けるべきであり、再帰を使用する関数は一般にループを使用するソリューションよりも効果が低いと言います。例として、著者は再帰を使用してJava関数を記述し、そのように数値の階乗を計算しました(現時点では本が手元にないため、まったく同じではない場合があります)。 public int factorial(int x) { if (x <= 0) return 1; else return x * factorial(x - 1); } これは悪い解決策として提示されます。ただし、関数型言語では、多くの場合、再帰を使用することが推奨される方法です。たとえば、再帰を使用したHaskellの階乗関数は次のとおりです。 factorial :: Integer -> Integer factorial 0 = 1 factorial n = n * factorial (n - 1) そして、良い解決策として広く受け入れられています。私が見たように、Haskellは再帰を非常に頻繁に使用しますが、眉をひそめているものはどこにも見ませんでした。 私の質問は基本的には次のとおりです。 関数型言語は非関数型言語より再帰をうまく処理しますか? 編集:私が使用した例は私の質問を説明するのに最適ではないことを認識しています。Haskell(および関数型言語全般)は、非関数型言語よりも再帰を頻繁に使用することを指摘したかっただけです。

11
whileループは本質的に再帰ですか?
whileループが本質的に再帰かどうか疑問に思いましたか? なぜなら、whileループは最後に自分自身を呼び出す関数とみなすことができるからだと思います。再帰ではない場合、違いは何ですか?
37 recursion  loops 

5
パフォーマンス:Javascriptでの再帰と反復
私は最近、Javascriptの機能面と、SchemeとJavascriptの関係に関する後者の記事(例:http : //dailyjs.com/2012/09/14/functional-programming/)を読みました。 OOの側面はプロトタイピングベースの言語であるSelfから継承されますが、機能的な言語です。 しかし、私の質問はより具体的です:Javascriptの再帰と反復のパフォーマンスに関するメトリックがあるかどうか疑問に思っていました。 一部の言語では(設計の反復によりパフォーマンスが向上する)、インタープリター/コンパイラーが再帰を反復に変換するため、差は最小限に抑えられますが、少なくとも部分的には機能的であるため、おそらくJavascriptのケースではないでしょう言語。

2
ループ(while / for)を再帰に、または再帰からループに変換する一般的な方法は?
この問題は主にアルゴリズムに焦点を当てており、おそらく抽象的でより学術的なものです。 例は思考を提供しているので、一般的な方法を使用したいので、例はあなたの思考についてより明確にするためにのみ使用されます。 一般的に、ループは再帰に変換できます。 例えば: for(int i=1;i<=100;++i){sum+=i;} そして、それに関連する再帰は次のとおりです。 int GetTotal(int number) { if (number==1) return 1; //The end number return number+GetTotal(number-1); //The inner recursive } そして最後にこれを簡素化するには、末尾再帰が必要です: int GetTotal (int number, int sum) { if(number==1) return sum; return GetTotal(number-1,sum+number); } ただし、ほとんどの場合、回答と分析はそれほど簡単ではありません。私が知りたいのは: 1)ループ(for / while……)を再帰に変換する「一般的な一般的な方法」を取得できますか?そして、変換を行う際にどのようなことに注意する必要がありますか?変換プロセスと同様に、いくつかのサンプルとあなたのpersudo理論で詳細な情報を書くほうが良いでしょう。 2)「再帰」には、線形再帰と末尾再帰の2つの形式があります。それで、どちらを変換するのが良いですか?どの「ルール」をマスターすべきですか? 3)再帰の「履歴」を保持する必要がある場合がありますが、これはループステートメントで簡単に実行できます。 例えば: List<string> history = new List<string>(); …

7
再帰をサポートしていない命令型プログラミング言語は何ですか?
私の知る限り、現代のすべての命令型プログラミング言語は、プロシージャがそれ自体を呼び出すことができるという意味で再帰をサポートしています。これは必ずしもそうではありませんでしたが、簡単なGoogle検索で難しい事実を見つけることはできません。だから私の質問は: 最初から再帰をサポートしていなかったのはどの言語で、そのサポートはいつ追加されましたか?

2
Yコンビネーターとテールコールの最適化
F#のYコンビネーターの定義は let rec y f x = f (y f) x fは、最初の引数として、再帰的サブ問題の継続を期待しています。yfを継続として使用すると、fが次の呼び出しに適用され、開発できることがわかります。 let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc... 問題は、先験的に、このスキームがテールコールの最適化を使用できないことです。実際、fで保留中の操作がある可能性があります。その場合、fに関連付けられたローカルスタックフレームを変更できません。 そう : 一方では、Yコンビネータを使用するには、関数自体とは明示的に異なる継続が必要です。 TCOを適用する必要がある場合は、fで保留中の操作はなく、f自体のみを呼び出します。 これら2つを調整する方法を知っていますか?アキュムレータトリックを使用したYや、CPSトリックを使用したYなど?それともそれができる方法がないことを証明する議論?

10
ポインター/再帰の難しさは何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 Javaスクールの危険の中で、ジョエルはペンでの経験と「セグメンテーションフォールト」の難しさについて話します。彼は言い​​ます [セグメンテーション違反はあなたまで難しい]「深呼吸をして、同時に2つの異なる抽象化レベルで心を働かせようとする。」 セグメンテーション違反の一般的な原因のリストを考えると、2つの抽象化レベルでどのように作業する必要があるのか​​理解できません。 なんらかの理由で、Joelはこれらの概念をプログラマーが抽象化する能力の中核と考えています。あまり思い込みたくありません。それでは、ポインタ/再帰について何がそんなに難しいのでしょうか?例はいいでしょう。
20 c  pointers  recursion 

2
コンパイラーは、再帰ロジックを同等の非再帰ロジックに変換できますか?
私はF#を学んでおり、C#をプログラミングしているときの考え方に影響を与え始めています。そのために、結果が読みやすくなると感じたときに再帰を使用していましたが、スタックオーバーフローに巻き込まれることを想像できません。 これは、コンパイラーが再帰関数を同等の非再帰形式に自動的に変換できるかどうかを尋ねることになりますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.