問題タブ [infinite-recursion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
3065 参照

java - 無限再帰ループを防ぐ方法

再帰問題の解決策が思いつかないようです。したがって、依存している他のバージョン オブジェクトへの参照のリストを保持するこの Version オブジェクトがあります。

バージョン

このオブジェクトを取得するときは、最終的に終了するまで、その依存関係と依存関係の依存関係も取得する必要があります。これは次のようになります。

バージョンDto

これは、バージョンを取得するための再帰関数です

ただし、バージョンが v1 -> v2 -> v4 -> v1 のようにネストされた依存関係の 1 つに依存し、無限の繰り返しが発生する可能性がある場合、無限ループの可能性の問題に遭遇します。

この無限ループをどのように解決して防ぐことができるので、以前にすべての準備が整ったバージョンが発生した場合、それをスキップする必要がありますか?

編集:グローバルリストを使用したソリューション

0 投票する
2 に答える
51 参照

c++ - テンプレート型リストの反復中に再帰を停止できません

だから私はこのようなテンプレートタイプのリストを持っています:

次のようなアクセサ関数を作成しました。

これif_else_t<>には次の実装があります。

今、関数を次のようにテストすると:

ElementIndex がリスト サイズより大きいかどうかをチェックする static_assert をトリガーします。at<>コンパイラの出力から、 ElementIndex が数値制限 (ElementIndex = 0 - 1 の場合) に達し、static_assert がトリガーされるまで、再帰が停止しないことがはっきりとわかります。

私は何を間違っていますか?

理想的な答えには、より優れた、よりエレガントな実装も含める必要がありますat<>:)

MSVC と C++17 を使用していることに注意してください。

0 投票する
1 に答える
84 参照

c++ - ユーザー定義 to_string() の欠落のコンパイル時の検出

to_string(obj)作成するすべてのオブジェクト タイプに関数を提供したいと考えています。私はこの質問を見つけ、受け入れられた回答を適用しましたが、うまくいきました。ここまでは順調ですね。

次に、新しいタイプを作成しましたが、そのための を書くのto_string()を忘れていました (または、誤って ADL からアクセスできないようにしてしまいました)。問題は、私のプログラムはまだ正常にコンパイルされ、実行時に不明瞭なスタック オーバーフロー (TM) が発生することです。

代わりに、妥当なエラー メッセージを取得する方法はありますか?

この問題を示す小さなプログラムを次に示します。notstd::to_string()との間の無限再帰notstd::adl_helper::as_string()です。

次のように、再帰防止チェックを実行するために使用する、もう 1 つのパラメーターを受け入れるラッパー関数を作成してみました。

ここでの問題は次のとおりです。

  • すべてのstd::to_string() オーバーロードをラップする必要があります
  • 実行時エラーのみが発生しますが、コンパイル時に問題を検出できるし、検出する必要があると感じています
  • 開発中にのみ役立つ何かのために、おそらくオーバーヘッドを追加しています。リリースモードでこれらすべてを無効にするマクロを追加することもできますが、さらに多くの作業が必要になります

テンプレートを使用してstd::to_string()、自分の型の特殊化をラップして作成することもできます...これはまったく別の獣ですが、適切な特殊化が利用できない場合、少なくともコンパイル時エラーが発生します。繰り返しになりますが、すべてのオーバーロードをラップする必要があり、std::to_string()少なくともすべてのコンパイラで c++20 がサポートされるまでは、おそらく (ほとんど) ADL を忘れる必要があります。

誰かがより良い解決策を持っていますか?

ありがとう!

0 投票する
0 に答える
66 参照

python - 無限再帰と sys.setrecursionlimit はエラーなしでスクリプトを停止します

実行時間を測定して、特にフィボナッチの 3 つの実装 (再帰、lru_cache、および線形 (線形空間を使用)) を比較して、いくつかの小さな実験を行いたいと思いました。無限再帰を作成する方法で誤って lru_ache バージョンを実装しました。

(本来は再帰版を再利用したかったのですが、再帰呼び出しにキャッシュが適用されないことがわかったので、これに変更しました)

これにより、プログラムはエラーやメッセージなしで単に停止しました。IDLE から起動した場合、RESTART: Shell回線を作成して REPL に戻ります

lru_cacheのドキュメント ページには、スクリプトを停止するという記述はありませんでした。

これは意図した動作ですか、それともバグの可能性がありますか?

編集:

再帰制限を sys 経由で 500_000 に設定しました。ただし、例外はまだあると思います。ドキュメントによると

制限が高すぎるとクラッシュする可能性があるため、これは慎重に行う必要があります。

しかし、メッセージが届かないとは言いません。ただし、これは事実かもしれません。

0 投票する
1 に答える
176 参照

recursion - 再帰は無限ループにできますか?

多くの場合、再帰は「無限ループ」になる可能性があると言うのを耳にしますが、それはループで行われる何かにのみ適用されるのではないでしょうか。そのような再帰を「無限ループ」と言うのは有効で正しいでしょうか? 「無限再帰」と言った方がいいのではないでしょうか?