記録 試験問題にチャレンジ♪('◇')ゞ

長年 メールマガジンで情報処理技術者試験のお勉強

(長年過ぎて 今では 脳訓練となっていますが(^.^) )

 

前回の問題は  「???」状態になる 問題でした

 

そのうえ ネット検索で 親切な方が書いてくださっている

模範解答を見ても 私の理解力では 「??」

 

それでも あきらめずに!!

 地道な方法で 理解しようと 高校数学サイトで見つけた

解説を読みながら 理解しようと・・・

表を書きつつ 一つ一つ 書き込み 

なんとなく 理解できたので ( `ー´)ノ

 

苦労して回答した問題!

自分なりの回答とともに、備忘録として

残します (#^.^#) 

 

↓ メールマガジンの問題 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

★これ、おしえてっ!(回答編)★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(^ )
ほとんど避けていた「再帰 呼び出し」でしたので
チャレンジしなくてはね~~~。

いままで ぼんやりだったのが、少しは「理解」出来たかも?
まだ 出来てない? かも(*^_^*) 


???の問題を考えて、調べて なんとなく 「!」('◇')ゞ
理解深めていきます。(・・やっぱ 楽しい(^.^)?)おばけくん三毛猫ハムスター