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

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

3
ネストされた関数呼び出しが多すぎますか?
StackOverflowExceptionについてMSDNから引用: ネストされたメソッド呼び出しが多すぎるために実行スタックがオーバーフローしたときにスローされる例外。 Too manyここはかなりあいまいです。多すぎると本当に多すぎることをどのようにして知ることができますか?何千もの関数呼び出し?何百万人?私はそれが何らかの形でコンピュータのメモリの量に関係しているに違いないと思いますが、大体正確な大きさのオーダーを考え出すことは可能ですか? 再帰構造と再帰関数呼び出しを多用するプロジェクトを開発しているので、これが心配です。ほんの小さなテスト以上に使用し始めたときに、アプリケーションが失敗するのは望ましくありません。

6
二重再帰関数のランタイムを決定するにはどうすればよいですか?
任意の二重再帰関数がある場合、実行時間はどのように計算しますか? 例(擬似コード): int a(int x){ if (x < = 0) return 1010; else return b(x-1) + a(x-1); } int b(int y){ if (y <= -5) return -2; else return b(a(y-1)); } またはそれらの線に沿って何か。 このようなものを決定するためにどのような方法を使用できますか?

4
TCOがない場合、スタックを爆破することを心配する場合
JVMを対象とする新しいプログラミング言語についての議論があるたびに、必然的に次のようなことを言っている人々がいます。 「JVMはテールコールの最適化をサポートしていないため、大量のスタックの爆発を予測しています」 そのテーマには何千ものバリエーションがあります。 今では、Clojureなどの一部の言語には、使用できる特別な再帰構造があります。 私が理解していないのは、テールコール最適化の欠如がどれほど深刻なのかということです。いつ心配する必要がありますか? 私の混乱の主な原因は、おそらくJavaがこれまでで最も成功した言語の1つであり、JVM言語のかなりの数がかなりうまくいっているように思われるという事実からでしょう。TCOの欠如が本当にあるならばどのようにそれが可能である任意の懸念?

2
再帰的な関数呼び出しのreturnステートメントの理由
私は自分の心に疑問を抱いていました。次のサブルーチン(リスト内の要素を検索するなど)の最後にはreturnステートメントがあります。 list *search_list(list *l, item_type x) { if (l == NULL) return(NULL); if (l->item == x) return(l); else return( search_list(l->next, x) ); } 最後にreturnステートメントの意味がわかりません(つまり、research search_list(l-> next、x))。誰もがスタックモデルを使用してこの概念を説明できれば、本当に役立ちます。

9
再帰の理解を改善するためのリソースはありますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 私は再帰とは何かを知っています(通常、パテンが自身内で発生するとき、通常はブレークアウト条件付き...の後にその行の1つでそれ自体を呼び出す関数ですか?)、それらを詳しく調べれば再帰関数を理解できます。私の問題は、新しい例を見ると、最初はいつも混乱していることです。ループ、またはマッピング、ジッピング、ネスト、ポリモーフィックコールなどが表示される場合、それを見るだけで何が起こっているかがわかります。再帰的なコードを見ると、私の思考プロセスは通常「wtf is this?」です。続けて「ああ、再帰的」、続いて「もし彼らが言うなら、うまくいくに違いない」と続きます。 この分野でスキルを構築するためのヒント/計画/リソースはありますか?再帰は奇妙な概念の一種なので、それに取り組む方法も同様に奇妙で明白ではないかと考えています。

2
Haskellのメモ化の背後にある概念を誰かが説明できますか?
(コーディングの問題ではなく、概念的なメカニズムに関するものなので、ここに質問を入れています) 私はそのequasionでフィボナッチ数列を使用していた小さなプログラム、に取り組んでいたが、私は特定の数を乗り越えた場合、それは痛々しいほど遅くなったことに気づいた、私はとして知られているハスケルの技術でつまずい少し周りグーグルMemoization、彼らは次のように動作するコードを示しました: -- Traditional implementation of fibonacci, hangs after about 30 slow_fib :: Int -> Integer slow_fib 0 = 0 slow_fib 1 = 1 slow_fib n = slow_fib (n-2) + slow_fib (n-1) -- Memorized variant is near instant even after 10000 memoized_fib :: Int -> Integer memoized_fib = (map fib …

7
再帰関数に反復/ループを含めることはできますか?
私は再帰関数について研究してきましたが、明らかに、それらは自分自身を呼び出す関数であり、反復/ループを使用しません(そうでなければ、再帰関数ではありません)。 しかし、例(8クイーンの再帰問題)のためにWebをサーフィンしているときに、この関数が見つかりました。 private boolean placeQueen(int rows, int queens, int n) { boolean result = false; if (row < n) { while ((queens[row] < n - 1) && !result) { queens[row]++; if (verify(row,queens,n)) { ok = placeQueen(row + 1,queens,n); } } if (!result) { queens[row] = -1; } }else{ result = …
12 java  recursion 

2
C ++のバックトラッキングを理解する
私はC ++の基本について十分に基本的な理解を持っています。また、再帰がどのように機能するかも理解しています。私は、古典的な8つのクイーンの問題やバックトラックで数独を解くなどの特定の問題に遭遇しました。 これに関してはかなり迷っていることに気づきました。再帰スタックに戻って問題を解決するためにやり直すという概念を思い浮かべることができないようです。ペンと紙で簡単に思えますが、このためのコードを書くことになると、これらの問題への攻撃を開始する方法について混乱しています。 バックトラックの初心者向けのチュートリアルがある場合や、これが取り上げられている良い本がある場合に役立ちます。誰かがこのトピックに光を当てるか、まともな参考文献へのリンクを教えてくれれば、本当にありがたいです。 そして、はい、関数型言語の方が簡単であることは知っていますが、命令型言語の実装についても理解したいと思います。
12 c++  recursion 

7
再帰-「分割して征服する」か「コードを再利用する」か
再帰 -誰もが知っているように-これらの問題の1つです-あなたの頭を包むことは、プログラミングの旅で「マイルストーン」を達成するような気がします。 しかし、実際の問題で実際に使用する場合は、再帰のメカニズムを知るだけでは十分ではありません。再帰が最も適切な解決策である問題の性質も理解する必要があります。 私の質問はこれです... 再帰の解決を要求する「問題パターン」とは何ですか 再帰は「分割統治」戦略の形式、または「コード再利用」の形式です-または、それ自体が設計パターンです 再帰が即座の解決策として頭に浮かぶ現実世界の問題の例を教えてください -更新- 多くの答えは、「本当の問題」をツリー探索や階乗などと呼んでいます。「本当の本当の問題」を好むでしょう。例を挙げましょう... テキストの大規模なチャック(のリンクリストとして約30 MBのテキストstructs)があり、全文検索のためにそのインデックスを作成する必要がありました。インデックス全体をメモリに保持し、10分ごとにテキストのインデックスを再作成する必要がありました。 10分ごとに、テキスト全体(2つのリンクリスト、1行ずつ)と新しく生成されたテキストチャンクを比較し、変更された行を確認し、その行のみを再インデックスしますテキスト全体のインデックスを再作成する必要がなくなりました。覚えておいてください-2つの30 MBのリンクリスト間の差分ポイントを見つける必要がありました。 私の同僚の一人は、HEAVY再帰を使用して行を比較する素晴らしいプログラムを思い付きました-そして、チャックが配列内で異なる位置を収集します-はいやった 要点は、再帰を頻繁に使用することで、この問題をスマートに解決できることをどのように確認できるのでしょうか?
11 recursion 

3
なぜ反復バージョンに時間がかかるのですか?
私はhttp://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/を見ていましたが、階乗関数の再帰的および反復的な実装の彼の実装では、実際には反復に時間がかかりますn = 1,000が与えられます。理由はわかりません(彼は説明しませんが、それは読者にとっての練習だと言います)。このすべてに私の新しさを申し訳ありません。

4
再帰を使用して問題を解決できるかどうかを判断するための考慮事項は何ですか?
インタビューでは、再帰を使用して問題を解決したり(1無限精度の整数に追加するなど)、問題が再帰を使用するのに適している場合があります。時には、問題解決のために再帰を頻繁に使用することが原因である可能性があるため、あまり考えずに、再帰を使用して問題を解決します。 しかし、問題を解決するために再帰を使用することが適切であると判断する前の考慮事項は何ですか? 私が持っていたいくつかの考え: 毎回半分にされるデータに対して再帰を使用すると、再帰を使用しても問題ないように思えます。16GBのRAMまたは8TBのハードドライブに収まるデータはすべて、42レベルの深さの再帰で処理できるためです。(したがって、スタックオーバーフローはありません(一部の環境では、スタックの深さは4000レベル、42を超える可能性がありますが、同時に、各コールスタックがより多くのメモリを占有するため、ローカル変数の数にも依存します多数のローカル変数があり、スタックオーバーフローを決定するのはレベルではなくメモリサイズです)。 純粋な再帰を使用してフィボナッチ数を計算する場合、中間結果をキャッシュしない限り、時間の複雑さを本当に心配する必要があります。 そして1、無限精度の整数に追加するのはどうですか?議論の余地があるかもしれませんが、3000桁または4000桁の数字を扱うので、スタックオーバーフローが発生する可能性がありますか?私はそれを考えていませんでしたが、おそらく答えはノーです、再帰を使用するべきではありませんが、単純なループを使用する必要があります数が素数であるかどうかなど、数のプロパティ。 最終的な質問は、問題を解決するために再帰を使用することを決定する前に考慮すべきことは何ですか?

3
対称性の下で一意であるnxnxn立方格子のm点のすべてのセットを生成するアルゴリズム
非常に計算が複雑になるアルゴリズムを実装しています。不要な作業を行わないようにしたいと考えています。 nxnxnの立方格子があります。たとえば、n = 2の場合、これは(0,0,0)、(0,1,0)、(1,0,0)、(1,1,0)、(0、 1,1)、(0,0,1)、(1,0,1)、(1,1,1)。 このラティスから、次のようなmポイントのすべてのセットを再帰的に生成します。 solve(set_of_points) { if set_of_points.size = m, finish do some useful computation here for each point in lattice not in set_of_points: solve(set_of_points + new_point); } これは、空のset_of_pointsから開始して呼び出すことができます。 問題の性質上、実際にはm個の点のすべての順列が必要なわけではなく、立方体の自然な対称性の下で一意であるものだけが必要です。 たとえば、2x2x2の立方体を取り、1点のすべてのセットが必要だとします。上記の基本的なアルゴリズムの下では、1つのポイントの8つの異なるセットがあります。 ただし、立方体の対称性を使用すると、元の8はすべて立方体の対称性の下で同等であるため、これを1ポイントの一意の1セットに減らすことができます(この場合、それらはすべて「コーナー」です)。 立方体が2x2x2でm = 2の場合、基本アルゴリズムには28セットありますが、これは対称性の下では3に減少します(例{(0,0,0)、(1,0,0)}、{(0 、0,0)、(1,1,0)}、{(0,0,0)、(1,1,1)}) 明らかに、3つのポイントセットで計算を行う方が28よりもはるかに優れているので、私の質問は、すでに生成されたセットと対称的に等しいポイントのセットを生成しないようにするにはどうすればよいですか?または、これが不可能な場合は、少なくともセットの数を少し減らすにはどうすればよいですか。 (注-m = 1の場合、これは比較的簡単です。他のどの頂点よりも(0,0,0)に近い点を選択し、境界を少しぼかします。m> 1の場合、本当の問題になる)

5
すべての再帰関数を反復でコーディングできますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 5年前休業。 再帰の利点は何ですか? 一部のプログラミング言語は末尾再帰を最適化できますが、一般的な用語では、再帰は通常のループよりも多くのリソースを消費します。 いくつかの再帰関数の反復バージョンを持つことは可能ですか?

6
再帰は並行して実行できますか?それは理にかなっていますか?
たとえば、次のように実行されるfibonacciの単純な再帰的アルゴリズムを使用しているとします。 fib(5) -> fib(4)+fib(3) | | fib(3)+fib(2)| fib(2)+fib(1) 等々 これで、実行は引き続きシーケンシャルになります。その代わりに、どのように私がいることを、このように、コードだろうfib(4)とはfib(3)、2つの別々のスレッドを生成することによって計算されるが、その後にfib(4)、2つのスレッドがために生み出されているfib(3)とfib(2)。がいつfib(3)に分割されるのかfib(2)と同じfib(1)ですか? (動的プログラミングはフィボナッチにとってはるかに優れたアプローチであることを知っています。ここで簡単な例として使用しただけです) (誰かがC \ C ++ \ C#でもコードサンプルを共有できる場合、それは理想的です)


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