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

自分自身の「小さい」インスタンスを使用して表現される関数、アルゴリズム、データ構造などのオブジェクトに関する質問。

3
バイナリツリーが検索ツリーであるかどうかをテストし、完全なブランチをカウントするアルゴリズム
再帰的アルゴリズムを作成して、バイナリツリーがバイナリ検索ツリーであるかどうかを確認し、想定されるグローバルカウント変数を使用して、そこに完全なブランチがいくつあるか(左と右の両方の子ノードを持つ親ノード)を数える必要があります。これは私のデータ構造クラスの割り当てです。 これまでのところ void BST(tree T) { if (T == null) return if ( T.left and T.right) { if (T.left.data < T.data or T.right.data > T.data) { count = count + 1 BST(T.left) BST(T.right) } } } しかし、これを実際に理解することはできません。2番目のifステートメントがtrueでない場合、カウントはゼロになるため、このアルゴリズムは問題を解決しないことを知っています。 誰かがこれを手伝ってくれる?

2
依存して型付けされたエリミネーターを導出する方法は?
依存型プログラミングでは、データを分解して再帰を実行する主な方法が2つあります。 依存パターンマッチング:関数定義は複数の句として指定されます。統一により、すべての省略されたケースが不可能であることが保証され、外部ソルバーが再帰の根拠を確実にします。 エリミネーター:各帰納的データ型は、帰納原理として、および型値を分解する再帰関数として機能する、関連する定数があります。これらはより冗長ですが、合計であり(すべてのケースはカバーされ)、構造によって終了するという利点があります。DDDEDEDE_DDDDEDEDE_D エリミネーターが基本的に数学的帰納であるなどの一般的なデータ型のエリミネーターや、エリミネーターが基本的にフォールドであるを見てきました。NatNatNatListListList 私は依存パターンマッチングに関するいくつかの論文を読んでおり、その多くはデータ型を定義できる型理論に言及しており、エリミネーターは理論によって提供されます。たとえば、依存パターンマッチングの除去では、UTTがエリミネーターに基づいている方法と、公理存在下でパターンマッチングを除去に変換する方法について説明しています。私の理解では、データ型が定義されると、理論はエリミネーターを提供します。KKK 私が見つけていない(または、少なくとも見た場合に認識されていない)ことは、エリミネーター(タイプとセマンティクスの両方)をどのようにして導き出すことができるかについての良い説明です。 誰かが、データ型の定義からエリミネーターを取得する方法を説明する参照を私に指摘できますか?

2
末尾再帰と構造再帰の違い
構造再帰とテール再帰の間に違いはありますか、それとも両方同じですか?これらの再帰の両方で、再帰関数が元のアイテムのサブセットで呼び出されていることがわかります。
8 recursion 

2
ループを使用して左再帰を処理する再帰降下パーサーの正しい名前は?
この文法は再帰的に残されています: Expression ::= AdditionExpression AdditionExpression ::= MultiplicationExpression | AdditionExpression '+' MultiplicationExpression | AdditionExpression '-' MultiplicationExpression MultiplicationExpression ::= Term | MultiplicationExpression '*' Term | MultiplicationExpression '/' Term Term ::= Number | '(' AdditionExpression ')' Number ::= [+-]?[0-9]+(\.[0-9]+)? したがって、理論的には、再帰的降下は機能しません。ただし、各左再帰ルールが特定の優先レベルに対応し、単一のトークンの先読みで正しい生成を選択するのに十分であるという文法のプロパティを利用することで、左再帰ルールをwhileループで個別に解析できます。 たとえば、AdditionExpression非終端を解析するには、次の疑似コードで十分です。 function parse_addition_expression() { num = parse_multiplication_expression() while (has_token()) { get_token() if (current_token …

1
この再帰的アルゴリズムの実行時間はどれくらいですか?
A229037 の最初の値を計算するというコードゴルフチャレンジのために、次の(無記号の)Haskellプログラムを作成しました。nnn これは、番目の値を計算するために提案するソリューションです。nnn a n | n<1 = 0 | n<3 = 1 | otherwise = head (goods n) goods n = [x | x <- [1..], isGood x n] isGood x n = and [ x - a(n-k) /= a(n-k) - a(n-k-k) || a(n-k-k) == 0 | k <- …

2
System Tでの高次プリミティブ再帰のためのアッカーマン階層
ゲーデルは、彼のSystem Tプリミティブ再帰でより高い型を定義しています。私はGirardからのメモを見つけました。彼は、単純に型指定されたラムダ計算に加えてSystem Tの実装を説明しています。50ページで、リカーサーでより多くの型を使用すると、システムでより表現力が高まると述べています。 これがどのように発生するのか正確にはわかりません。より高次のプリミティブ再帰を伴う一種のアッカーマン階層を考案することは可能ですか?つまり、各関数はSystem Tで表現可能ですが対角線は表現できない、より速く成長する関数の階層ですか?私はそう思うが、その構造は私には明らかではないようであり、どのようにそれを構築するか、または文献へのポインタを受け取るかについて興味がある。 私は何か具体的なものを求めています。Tにない関数の存在を証明する一般的な対角引数は知っていますが、実際に「型階層にステップアップ」する方法を確認したいと思います。

4
配列をに分割した場合の再帰の深さは何ですか
配列を入力として受け取る関数があります。配列を同じサイズの部分に分割しますは配列のサイズです。要素が2つだけ残るまで、各サブ配列を分割し続けます。この再帰の深さはどれくらいですか?log2(n)log2⁡(n)\log_2(n)nnn プロセスの例: 最初に要素があり、それらを同じサイズの部分に分割します。これらの各部分には、要素が含まれています。次のレベルの再帰では、各配列を同じサイズの部分に再度分割します。これらの各要素には、要素が含まれるようになります。そして、要素が2つしかないサブ配列に到達するまで、この方法で配列を分割し続けます。nnnlog2(n)log2⁡(n)\log_2(n)nlog2(n)nlog2(n)\frac {n} {log_2(n)}log2(nlog2(n))log2(nlog2(n))log_2(\frac {n} {log_2(n)})nlog2(n)log2(nlog2(n))nlog2(n)log2(nlog2(n))\frac {\frac {n} {log_2(n)}} {log_2(\frac {n} {log_2(n)})}

4
再帰を教える
私は大学の教員補佐です。次のトピックは再帰です。学生が概念を簡単に把握して再帰的に考えることができるように、再帰を教えるのに最適な方法はどれですか。 再帰を教えるためにスタック構造を説明することを考えていましたが、プロセスを追跡する際にスタックするのではないかと心配しています。ヒントはありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.