
出典:公益社団法人 日本技術士会「技術士第一次試験 過去問題」
C言語の再帰関数p(x,y)(x>yならp(x−y,y)、x<yならp(y−x+2,x)、そうでなければx)で、printf("%d", p(5,6))の出力結果を求める問題。
再帰呼出しを、順にたどって(トレースして)、戻り値を求める問題。
① 再帰関数は、条件(x=y、x>y、x<y)を見て、引数を1回ずつ書き換えていけばよい
② p(5,6)→p(3,5)→p(4,3)→p(1,3)→p(4,1)→p(3,1)→p(2,1)→p(1,1)でx=y
③ 1(①)
p(5,6):x<yなので、p(6−5+2,5)=p(3,5)。p(3,5):x<yなので、p(5−3+2,3)=p(4,3)。p(4,3):x>yなので、p(4−3,3)=p(1,3)。p(1,3):x<yなので、p(3−1+2,1)=p(4,1)。p(4,1):x>yなので、p(3,1)。p(3,1):x>yなので、p(2,1)。p(2,1):x>yなので、p(1,1)。p(1,1):x=yなので、xを返し、1。したがって出力は1で、①が正しい。
再帰関数のトレースでは、呼出しの引数を1段ずつ書き出し、終了条件(x=y)に達したときの戻り値を、そのまま呼出し元へ返す(末尾再帰)。
キーワード: 再帰関数、C言語、トレース、プログラムの実行結果、再帰呼出し、情報工学部門