
出典:公益社団法人 日本技術士会「技術士第一次試験 過去問題」
Pythonで定義された再帰関数f(m, n)(m==0のときn+1、n==0のときf(m-1,1)、それ以外はf(m-1, f(m, n-1)))について、f(1,3)の返す値を求める問題(アッカーマン関数)。
アッカーマン関数の形の再帰関数について、f(1,3)の値を求める問題。
① m=0ならn+1を返す。それ以外は、内側のf(m, n−1)を先に計算して外側に戻る
② f(1,0)=f(0,1)=2 → f(1,1)=f(0,2)=3 → f(1,2)=f(0,3)=4 → f(1,3)=f(0,4)=5(f(1,n)=n+2)
③ 5(①)
関数の定義は、f(0,n)=n+1、f(m,0)=f(m-1,1)、f(m,n)=f(m-1, f(m,n-1)) である。これはアッカーマン関数である。f(1,0)=f(0,1)=2。f(1,1)=f(0,f(1,0))=f(0,2)=3。f(1,2)=f(0,f(1,1))=f(0,3)=4。f(1,3)=f(0,f(1,2))=f(0,4)=5。したがって f(1,3)=5 であり、①が正しい。一般に f(1,n)=n+2 となる。
■ 再帰呼び出しの読み方
この関数fは、自分自身(f)を中で呼び出しています(再帰)。f(m, n−1)のような内側の呼び出しの値が分からないと外側が計算できないので、nが0になるまで内側へ進み、分かった値を使って外側へ戻りながら計算します。
・mが0なら、すぐにn+1を返す
・nが0なら、f(m−1, 1)を計算して返す
・それ以外は、まずf(m, n−1)を計算し、その結果をkとしてf(m−1, k)を返す
正解の理由では、f(1,0)→f(1,1)→f(1,2)→f(1,3)と、分かった値を順に使って外側へ戻る形で計算しています。
アッカーマン関数 A(m,n) は、A(0,n)=n+1、A(m,0)=A(m-1,1)、A(m,n)=A(m-1,A(m,n-1))。A(1,n)=n+2、A(2,n)=2n+3 で、mが増えると急激に増大する。
キーワード: アッカーマン関数、再帰関数、Python、再帰呼出し、プログラミング、情報工学部門