- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javaでのアッカーマン関数)
Javaでアッカーマン関数の実装方法は?
このQ&Aのポイント
- アルゴリズムの勉強中に、kupc(2012:practice)のサイトで見つけたアッカーマン関数の問題を解くためにJavaプログラムを作成しました。
- ただし、入力例の(3,45)ではjava.lang.StackOverflowErrorが発生しました。bigintegerを使用したり例外処理を考えてみましたが、解決策が見つかりません。
- アッカーマン関数についてのJavaプログラムでStackOverflowErrorが発生してしまう場合、どのように対処すれば良いのか教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
java.lang.StackOverFlowErrorは名前の通りスタックがオーバーフローした状態を表します。 変数の桁数は関係ないですから、 このエラーに関しては変数の型を変えても意味はありません。 関数を呼ぶと、引数の情報・関数から戻った後に実行する命令のアドレスが スタックと呼ばれる領域に格納されます。 これらのデータは関数から戻るまで削除されないため、 再帰の階層が深くなりすぎるとスタックを使い切ってしまい、上述のエラーが発生します。 Java VMの設定でスタック領域を増やすといった対策も考えられますが、 アルゴリズムの勉強とのことですので、 再帰の階層が深くなりすぎないように工夫するのもおもしろいと思います。
その他の回答 (2)
- salsberry
- ベストアンサー率69% (495/711)
回答No.3
深い再帰呼び出しでStackOverflowErrorが出る場合は、javaの-Xssオプションでスタックを増やしてあげればStackOverflowErrorを出さずに実行を継続できるようになる場合があります。 しかしこの場合は無意味でしょう。 Ackermann(3,45)の再帰呼び出しの深さは約2の48乗になります。呼び出し1段で仮にスタックを64バイト消費するとすれば、2の54乗バイト(16ペタバイト)のメモリが必要になります。そんな大量のメモリを積めるコンピュータはありません。 再帰が深くならないように書き換えられればいいのですが、アッカーマン関数は再帰を使わない書き方が不可能であることが証明されています。
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.1
えぇっと, java.lang.StackOverflowError の理由は把握できてますか? ちなみにこの問題, 「与えられた引数に対するアッカーマン関数の値」が計算できればいいんだよね.
補足
おっしゃる通りでアッカーマン関数の値が計算するのが目的です。 StackOverFlowは再帰的に行う計算量と桁数が大きくなりすぎてなっていると思っています。