問題タブ [ackermann]
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.
haskell - haskell-ハイパーオペレーション(アッカーマン)関数、テトレーション
haskellでハイパー演算関数を書こうとしています。
通常は次のように書かれてackermann(a,b,n)
いますが、部分適用の目的では、最初に置く方が理にかなっていると思いますn
。そういうものとして私はそれを呼んでいますhypOp n a b
replicate
私が最も自然な使用法を見つけたフォームは、次のようなリストを折りたたむ。
フォールドに対する関数の引数に応じて、これは加算、乗算、べき乗、テトレーションなどになります。
非公式の概要:
連想的な理由から、私は右の折り目を使用する必要があるという印象を受けています。これは、左の折り目(foldl'
)で利用できる厳密さが役立つため、残念です。
右と左の折り目の問題
後継関数で最初から「開始」すると、1つずつ問題が発生します。代わりに、ベースフォールドの関数として(+)を使用しています
最初のいくつかn
の値は、「手動で」実行されます。
上記のアプローチによる正式な定義の私の試み:
再帰配列を使用したその他の試み(重要な点で違いはありません):
だから私の質問は...
- 一般的な提案、機能に対するさまざまなアプローチはありますか?haskellを使用して慣用的なスタイルでコーディングしようとするときに私の意図ではない非常に「命令型」のスタイルを使用することを除いて、オーバーフローを回避する方法を見つけることができないようです。
- 私のオフバイワンの問題にどのように対処できるので、一番下から「適切に」始めることができます。
succ
- 厳格さと左対右の折り目。で働く方法はあり
seq
ますか?foldl1'
上記の問題の代わりに使用しfoldr1
て、上記の問題を回避する方法はありますか?
assembly - x86 アセンブリ (NASM) での再帰的 Ackermann-Peter 関数
x86 NASM-Assembly で再帰的な Ackermann-Peter-Function を実装しようとしています。関数は次のように定義されます。
*a(0;m) = m + 1
*a(n + 1; 0) = a(n; 1)
*a(n + 1;m + 1)) = a(n; a(n + 1;m))
私の問題は、適切に開始する方法さえ想像できないことです。今では、アセンブリで再帰的に「x の累乗」関数のみを実装しました。
http://pastebin.com/rsWALyCq (ドイツ語のプロンプトは n と m を要求するだけです)
これで得られるあらゆる助けに感謝します。
--
SO私はプッシュ/ポップステートメントを対称にしましたが、それでもセグメンテーション違反が発生します。全体をデバッグしようとしましたが、firstcase 内に Debug-Message を配置しました。私はプログラムをコンパイルし、n=0 と m=0 で試してみましたが、Debug-Message が出力されないため、firstcase に入ることさえありません。なぜ彼がそれをしないのか、私にはどうにかして見つけることができないようだ.
Heres 私の現在の試み: http://pastebin.com/D4jg7JGV
set - アッカーマン関数が、素集合に使用される和集合検索アルゴリズムの償却された複雑さに関連しているのはなぜですか?
なぜアッカーマン関数http://en.wikipedia.org/wiki/Ackermann_functionが素集合http://en.wikipedia.org/ wiki/Disjoint-set_data_structure ?
Tarjan のデータ構造に関する本の分析は、あまり直感的ではありません。
アルゴリズムの紹介でも調べましたが、厳密すぎて直感的ではないようです。
ご協力いただきありがとうございます!
c - Ackermannを計算するときにスタックの使用状況を確認する方法
私は、2パラメーターバージョンと3パラメーターバージョンの両方でアッカーマンのアルゴリズムを計算するシステムの機能について学習しています。mとnの値が非常に小さい場合、私のシステムはA0およびA1メソッド呼び出しから返される結果を計算して出力します。ただし、3または4を超えるものは返されず、atmを使用している端末がフリーズします。私の問題は、私のマシンが計算できるmとnの値を決定することです。
私はスタックオーバーフローをキャッチするためにいくつかのことを試みました。c++にはキャッチできるstackoverflowexceptionがないことを私は知っています。try-catchブロックは機能しません。以下のコードでは、getrlimit()を使用してスタック制限を見つけ、メインのgStackRefにアドレスの場所を作成します。gStackLimitへのローカル変数ポインターを再帰的にチェックするcheckStackを呼び出します。
再帰メソッドに関連してスタックの使用状況をチェックするより良い方法はありますか?また、セグメンテーション違反をチェックしますか?UNIX端末で実行していることをお知らせします。
java - アッカーマン関数と再帰
Javaで再帰的なアッカーマン関数を書いてみました。しかし、私はどこかで非常に間違っていると思います!誰かが私のコードを修正する正しい方向を見て、確認し、多分私を指し示すことができますか?ありがとう!
私がコードに関して抱えている問題は、私がそれを書いた後、n==0とm==0の場合、これのための領域がないのではないかと思ったということです。これはif(m == 0)に該当しますか、それとも独自のifステートメントが必要ですか?
私の次の解決策は正しいですか?異なる順序で同じ番号を付けると、異なる結果が得られ、これが当てはまるかどうかはわかりません。
私はそれについてもう少し考えました、そして私は私がさらに間違って行ったと思います。私が何をしたかわからない場合は、それぞれのifステートメントを反対に指定しました。これは、m値とn値が異なる方法で指定されている場合、次のコードが機能すると考えたためです。明らかにそうではありませんが、誰かが私がどこで間違っているのかを説明しようとすることができますか?
coq - Coq で Ackermann を定義する際のエラー
Coq で Ackermann-Peters 関数を定義しようとしていますが、理解できないエラー メッセージが表示されます。ご覧のとおりa, b
、Ackermann の引数をペアでパッケージ化していますab
。引数の順序付け関数を定義する順序付けを提供します。次に、Function
フォームを使用して Ackermann 自体を定義し、引数の順序付け関数を提供しab
ます。
私が得るのは、次のエラーメッセージです。
エラー: そのようなセクション変数または仮定はありません:
ack
。
何が Coq を悩ませているのかわかりませんが、インターネットを検索すると、再帰呼び出しが一致内で発生する場合に、順序付けまたはメジャーで定義された再帰関数の使用に問題がある可能性があるという提案が見つかりました。ただし、射影fst
およびsnd
を使用するとif-then-else
、別のエラー メッセージが生成されました。誰かが Coq で Ackermann を定義する方法を提案できますか?
c++ - アッカーマン関数はC++では正しく機能しません
アッカーマン関数の宿題では、次のように問題を解決しました。
この関数は、m=3およびn=10までの低い値でうまく機能しますが、m = 4/aboveまたはn=15/aboveを指定するとこれは機能しません。私は出てこない。プログラムは、警告、エラー、または結果なしで終了します。
誰かがこれが起こっている理由とこの問題をどのように解決できるか教えてください。
haskell - アッカーマン関数のメモ化
を使用A(3, 20)
する必要があるアッカーマン関数(ウィキペディアを参照)の値を計算したいと思います。私のコードは次のとおりです。2^23 - 3 = 8388605
Data.MemoCombinators
しかし、それはスタックオーバーフローエラーで終わります;-)それを調整することはできますか、それとも計算チェーンが本当に長く、メモ化でさえ助けになりませんか?
c - Cでkの倍数である再帰関数呼び出しをカウントする
割り当てられたのは、再帰を使用してアッカーマン方程式を計算するプログラムを作成することでした。これは成功しました。課題の一部は次のように述べています。
「関数は、k の倍数である再帰関数呼び出しの数を出力する必要があります。n; m <= 3 の値に対して k = 100 を設定し、他のすべての値に対して k = 1; 000; 000 を設定します。プログラムは、行われた関数呼び出しの総数。」
アッカーマン関数は、関数呼び出しと再帰関数呼び出しの数を出力することになっていますが、その方法がわかりません。どんな助けでも素晴らしいでしょう。ありがとう!
これは私がこれまでに持っているものです: