長年 メールマガジンで情報処理技術者試験のお勉強
(長年過ぎて 今では 脳訓練となっていますが(^.^) )
前回の問題は 「???」状態になる 問題でした
そのうえ ネット検索で 親切な方が書いてくださっている
模範解答を見ても 私の理解力では 「??」
それでも あきらめずに!!
地道な方法で 理解しようと 高校数学サイトで見つけた
解説を読みながら 理解しようと・・・
表を書きつつ 一つ一つ 書き込み
なんとなく 理解できたので ( `ー´)ノ
苦労して回答した問題!
自分なりの回答とともに、備忘録として
残します (#^.^#)
↓ メールマガジンの問題
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
★これ、おしえてっ!(回答編)★vol.3591(2020.7.29)の質問に対する回答
--------------------------------------------------------------
今回の質問はこちらでした。(出典:H30.春 応用情報 問5)
--------------------------------------------------------------
非負の整数 m,n に対して次のとおりに定義された関数 Ack(m, n)
がある。 Ack(1, 3) の値はどれか。
┌ Ack(m-1, Ack(m, n-1)) ( m > 0 かつ n > 0 のとき)
Ack(m, n) = │ Ack(m-1, 1) ( m > 0 かつ n = 0 のとき)
└ n+1 ( m = 0 のとき)
ア 3 イ 4 ウ 5 エ 6
--------------------------------------------------------------
楽しいという声も聞こえたのでもう1問(^^)
以上が メルマガ
(‘◇’)ゞ 前回の問題の回答を送ったとき、
ついつい「楽しい」と書いてしまった・・・。
調べた時 解説書や 検索では このような解説↓でしたが
私の頭脳回路は 反応しませんでした・・・((+_+))
参照サイト
https://www.ap-siken.com/kakomon/30_haru/q5.html
解説
設問の再帰関数 Ack(1,3) を実行すると次のようになります。
Ack(1,3)
//Ack(1,3)は、m>0かつn>0
=Ack(0,Ack(1,2))
//Ack(1,2)は、m>0かつn>0
=Ack(0,Ack(0,Ack(1,1)))
//Ack(1,1)は、m>0かつn>0
=Ack(0,Ack(0,Ack(0,Ack(1,0))))
//Ack(1,0)は、m>0かつn=0
=Ack(0,Ack(0,Ack(0,Ack(0,1))))
//Ack(0,1)は、m=0
=Ack(0,Ack(0,Ack(0,2)))
//Ack(0,2)は、m=0
=Ack(0,Ack(0,3))
//Ack(0,3)は、m=0
=Ack(0,4)
//Ack(0,4)は、m=0
=5
したがって「ウ」が正解です。
だそうです
(頭の中 花~とんでいます)
(私が 高校数学サイトを見て 考えて 調べて 送った回答)↓
今回の問題は 再帰的 処理と アッカーマン関数。
再帰 【 recursion 】 リカーシブ
再帰とは、あるものの定義や記述に、それ自身が含まれること。
そのような定義を「再帰的定義」という。
関数やメソッドなどの処理内容の記述の中に、自身の呼び出しを行なう
コードが含まれることを「再帰呼び出し」
(recursive call:リカーシブコール)、そのような関数を
「再帰関数」(recursive function)という。
アッカーマン関数
アッカーマン関数 A(m,n) とは,非負整数 m,n を入力とする
二変数関数であり,m≥4 のときに猛烈に大きい値を取る。
(トレッキー 笑)
アッカーマン関数は以下の式によって 再帰的に定義
されます。
1 Ack(m-1, Ack(m, n-1)) ( m > 0 かつ n > 0 のとき)
2 Ack(m-1, 1) ( m > 0 かつ n = 0 のとき)
3 n+1 ( m = 0 のとき)
(注 問題文の順に表記)
イメージとしては エクセルの表(C言語の切り札P57配列 参照)
縦が m(行) 横が n(列)
(m n)が決まることで 例えば(0. 1 )なら
m=0とn=1の「セルの中の値」を探す
n= │0│ 1│2 │3 │
┼─┼─┼─┼─┤
m=0│ │★│ │ │
問題文より それぞれの セルの中を計算して埋めていく
m=0 は ↑の式 3 n+1 ( m = 0 のとき) なので
n=0の時は 0+1=1
n=1の時は 1+1=2
n=2の時は 2+1=3 ~ と計算していく
n= │0 │1 │2 │3 │4 │
┼─┼─┼─┼─┼─┼
m=0 │1 │2 │3 │4 │5 │
m=1のとき
n=0の時は 式 2 Ack(m-1, 1) ( m > 0 かつ n = 0 のとき)なので
Ack(1-1,1)=(0,1)を調べると 上の表から 値は「2」なので
m=1 n=0の セルの中に 「2」を入れる
n= │0 │1 │2 │3 │
┼─┼─┼─┼─┤
m=1│2 │ │ │ │
次に m=1 n=1の時は
式1 Ack(m-1, Ack(m, n-1)) ( m > 0 かつ n > 0 のとき)を使う
★ (ここでかなり ???でした)
Ack(m-1, Ack(m, n-1))=Ack(0,Ack(1,0) )なので
Ack(1,0)は 上の表より 「2」
Ack(0,2)となり、最初の表を見ると(m=0,n=2)の値は「3」
ゆえに、m=1 n=1の値は 「3」
n= │0 │ 1│ 2│ 3│
┼─┼─┼─┼─┤
m=1│2 │3 │ │ │
次に m=1 n=2の時は 1の式を使って
Ack(m-1, Ack(m, n-1))=Ack(0,Ack(1,1) )なので
Ack(1,1)は 上の表より 「3」
Ack(0,3)となり、最初の表を見ると(m=0,n=3)の値は「4」
ゆえに、m=1 n=2の値は 「4」
n= │0│ 1│2 │ 3│
┼─┼─┼─┼─┤
m=1│2 │3 │ 4│ │
やっと 最後(*^_^*)
次に m=1 n=3の時は 1の式を使って
Ack(m-1, Ack(m, n-1))=Ack(0,Ack(1,2) )なので
Ack(1,2)は 上の表より 「4」
Ack(0,4)となり、最初の表を見ると(m=0,n=4)の値は「5」
ゆえに、m=1 n=3の値は 「5」
n= │0 │1 │2 │3 │
┼─┼─┼─┼─┤
m=1 │2 │3 │4 │5 │
Ack(1, 3) の値 行 m=1 列 n=3 の表から値は「5」
回答は ウ 5
n= │0│ 1│ 2│ 3│ 4│
┼─┼─┼─┼─┼─┼
m=0│ 1│ 2│3 │4 │5 │
┼─┼─┼─┼─┼─│
m=1│2 │3 │4 │5 │ │
参照サイト
高校数学の美しい物語 「巨大数:アッカーマン関数とは」
https://mathtrain.jp/ackermann
尚 m=2以上は複雑に・・
特にm=4以上は 巨大・・((+_+))
--------------------------------------------------------
・・・「楽しい」って言わなきゃよかった・・
と反省しつつも、 ( ^)o(^ )
ほとんど避けていた「再帰 呼び出し」でしたので
チャレンジしなくてはね~~~。
いままで ぼんやりだったのが、少しは「理解」出来たかも?
まだ 出来てない? かも(*^_^*)
???の問題を考えて、調べて なんとなく 「!」('◇')ゞ
理解深めていきます。(・・やっぱ 楽しい(^.^)?)