問題タブ [mutual-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 投票する
2 に答える
163 参照

javascript - Javascriptで相互再帰構造を作成するには?

Javascript で相互に再帰的なオブジェクトを使用できるかどうか疑問に思っていました。

ゴール:

3 つのオブジェクトが必要です。

  1. Boolean2 つの値を持つ型を表すものとTrueFalse
  2. タイプのTrueオブジェクトを表すものBoolean
  3. タイプのFalseオブジェクトを表すものBoolean

秘訣は、Trueオブジェクトにその型を尋ねたい場合、オブジェクトを取得する必要があり、オブジェクトにその値を問い合わせたい場合、オブジェクトとオブジェクトの 2 つのオブジェクトを取得する必要がBooleanあるということです。BooleanTrueFalse

しかし、私がこのようなものを得るという意味で、それは完全に相互に再帰的でなければなりません(必ずしもこれとまったく同じである必要はありません):

等々...

それが役立つ場合、それらは次の特性を満たす必要があります。

そしてこれを行う能力は無限であるべきです

ノート

これらは、オブジェクトではなく関数である可能性があります。そして、呼び出しはこのようである必要はありません。

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

c++ - 循環依存を避ける - 相互封じ込めの必要性

私の GUI システムでは、主要なビルディング ブロックは描画可能Containerなクラスです (= 描画可能です)。ただし、それ自体は「一種のテーブル」であり、セルが含まれています。Container

Cellクラスはレイアウトに役立ちます。コンテナーが持つセルの数は、行と列の数によって定義されます。Cellオブジェクトは表示されません。

そして、ここに問題があります。Cellオブジェクトは描画できません。オブジェクトにはオブジェクトが含まれており、呼び出し時にオブジェクトContainerで定義された規則Cell(配置、パディングなど)によって描画されますcell.draw()

ここで作成された循環依存関係を回避するために raw ポインターを使用することで、これを簡単に解決できることはわかっていますが、可能であればスマート ポインターを使用したいと考えていました。ただし、取得しているエラーによると、生のポインターとは異なり、スマートポインターがオブジェクトのサイズを認識している必要があることは明らかです。

Unique_ptr エラー

コンテナ.hpp

セル.hpp

スマート ポインターを使用して状況を解決する良い方法はありますか (おそらく問題の解決策全体を再設計することによって)、またはここで生のポインターを使用する必要がありますか?

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

haskell - 関数型プログラミング言語における相互再帰関数

スタック オーバーフローを防ぐために、単一の再帰関数に末尾再帰の最適化を適用できますが、相互再帰関数についてはどうでしょうか。

この回答は、F# で相互再帰関数を定義する方法を示しています。

生成されたネイティブ マシン コードまたはバイトコードが最終的に F と G の両方に末尾再帰の最適化が適用された 1 つの関数だけで構成されるように、このように定義されていますか? これはスタックオーバーフローを防ぎますか?

相互再帰関数の末尾呼び出しのアルゴリズムはどのように機能しますか?

一方、Haskell ではそのような構文は必要ありません。Haskell の遅延評価のせいでしょうか。または@augustssが示唆するように、Haskellコンパイラも上記と同じことをしていますか?

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

haskell - OCaml の相互再帰型

Haskell では、次のことができます。

OCaml で同じことを行うにはどうすればよいでしょうか? 私は試した:

OCamlで相互に再帰的なデータ型を定義することさえ可能ですか? そうでない場合、なぜですか?

let 式とデータ定義の比較: 相互に再帰的なデータ型は using に対応しますlet rec(または、より適切なtype rec言い回しが必要な場合はより適切です)。相互に再帰的なデータ型を定義できる利点は何ですか? 私のfoobarの例は些細なことです。相互に再帰的なデータ型の自明ではない使用法を思いつきますか?

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

java - Javaで2つの相互再帰メソッドを単一の再帰メソッドに変換しますか?

相互に再帰的な 2 つのメソッドを持つプログラムを使用し、そのプログラムを修正して、単一の再帰的なメソッドを含める必要があります。私が理解していることから、再帰呼び出しを呼び出された順序で単一のメソッドに配置することにより、2 つの再帰メソッドを組み合わせる必要があります。問題は、メソッドを介して渡される 4 つの整数があり、最初のメソッドが 2 番目のメソッドを 2 回呼び出し、2 番目のメソッドが最初のメソッドを 2 回呼び出すことです。

これは元のコードです:

以下は、私の最新の変更されたコードです。醜いことはわかっていますが、x座標とy座標を互いに独立して調整する方法がわかりません。より多くの変数を作成してこれを修正しようとしましたが、より多くの作業を行っているだけだと感じずにはいられません。私が見つけた最も近いスタックの質問はthisでした。11時からやっていて、今4時15分です。正しい方向への微調整は大歓迎です。お時間をいただきありがとうございます。

編集 * 迅速な返信ありがとうございます。相互に再帰的なメソッドをこのように分割するのは直観に反するように思えますが、プログラミングと Java は初めてなので、問題を分割するさまざまな方法を模索しています。これは私が最終的に分解したもので、問題なく動作します。お時間をいただきありがとうございます。

変更されたコード:

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

python - Pythonは相互再帰をどのように実装していますか?

C/Java の背景を持つ python に移行して、最近相互再帰を実装する必要がありましたが、python の何かが気になりました:

Python プログラムは行ごとに解釈されるため、同じ Python ファイルに 2 つの関数が次々にある場合:

インタプリタが を読んでいるとき、ABまだ定義されていませんが、このコードはエラーになりません

私の理解では、defが解釈されると、python は を使用してローカル名前空間にエントリを追加しますlocals(){"function name": function address}、関数本体に関しては、構文チェックのみを行います。

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

f# - タプルの要素を抽出して合計する相互再帰

次のように定義されたよりプリミティブな型で構成される相互再帰型を作成しました。

subcol は空のリストである場合とそうでない場合がありますが、そうでない場合は、指定されたコレクションの値と、Subcol の再帰呼び出しとそれに含まれる値の定義の両方を合計したいと思います。これを行うために、次の関数を作成しました。

私は関数呼び出し colList を期待しています

Subcol 型から int を生成するには、次のエラーが発生します。

エラー FS0001: タイプが一致しません。値リストが必要ですが、サブコルが指定されています タイプ「値」がタイプ「コレクション」と一致しません

colList が値リストではなく、サブコルを受け入れるようにします。

どんな助けでも大歓迎です、ありがとう。

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

c - C と Haskell にわたる相互再帰での末尾呼び出し最適化のコンパイル

Haskell で外部関数インターフェイスを試しています。相互再帰を実行できるかどうかを確認する簡単なテストを実装したかったのです。そこで、次の Haskell コードを作成しました。

再帰的なケースはcountdownCの呼び出しであるため、これは末尾再帰でなければならないことに注意してください。

私のCコードでは、

これは同様に末尾再帰です。だから私は

でコンパイルしmake MutualRecursionます。

そして...実行すると、印刷後にセグメンテーション違反が発生します8991。gcc 自体が相互再帰で tco を処理できることを確認するためのテストとして、

そしてそれは非常にうまくいきました。また、C と Haskell のみの単一再帰の場合でも機能します。

私の質問は、外部 C 関数の呼び出しが末尾再帰であることを GHC に示す方法はありますか? Cコードは明らかに関数呼び出しのリターンであるため、スタックフレームはHaskellからCへの呼び出しから来ており、その逆ではないと仮定しています。