Transcript 再帰関数
高度プログラミング演習
(07)
演習問題
• 月と日を入力して、それが1月1日から何一目
であるか表示するプログラムを作成せよ。(た
だし閏年は考慮しないこととする。)
• 入力された2つの月日を求めるプログラムを
作成せよ。(ただし、閏年は考慮しないことと
する。)
#include<stdio.h>
int md(int m,int d)
{
switch (m)
{
case 12:
d = d + 30;
case 11:
d = d + 31;
case 10:
d = d + 30;
case 9:
d = d + 31;
case 8:
d = d + 31;
case 7:
d = d + 30;
case 6:
d = d + 31;
main()
{
int m0,d0,m1,d1;
case 5:
d = d + 30;
case 4:
d = d + 31;
case 3:
d = d + 28;
case 2:
d = d + 31;
case 1:
d = d;
}
return d;
}
scanf("%d %d %d %d",&m0,&d0,&m1,&d1);
printf("%d\n",md(m1,d1)-md(m0,d0));
}
再帰関数
• 再帰
– 動作の対象が動作主そのもの。
• 主語 = 目的語
– 彼は自分のことが好きだ。
– He loves himself.
• 再帰関数
– 自分の中で自分自身を呼び出している関数。
void foo()
{
…………
…………
foo();
}
再帰関数を使う例(1)
• n の階乗
– n! = n × n-1 × n-2 …. × 1
f(n)
f(n-1)
f(n-2)
f(0)
n*(n-1)*(n-2)*..*2*1
1*1
1
include <stdio.h>
int fact(int n)
{
if(n==0)
return 1;
else
return n * fact(n-1);
}
main()
{
int n;
scanf("%d",&n);
printf("%d ! = %d\n",n,fact(n));
}
再帰関数を使う例(2)
• 10進表記の数 num を x進法表記するプログ
ラム。
• num を x で割ったあまり桁の数字になる。
– 一番最初のあまりが一番小さい桁
• num が x よりも小さくなればそれが一番大き
な桁になる。
10進表記 → 2進表記
#include <stdio.h>
1. num
2. num は 2 よりも大きい
5. num を表示す
る
3. num を 2 で割る
4. num % 2 を表示する
1. 2. 3. 2. 3. … 5. 2. 3. 4. 3. 4
void d2x(int num,int x)
{
if(num<x){
printf("%d",num);
return;
}
d2x(num/x,x);
printf("%d",num%x);
}
void main()
{
int num,x;
scanf("%d %d",&num,&x);
d2x(num,x);
printf("\n");
}
例題問題
• 与えられた2数のべき乗を計算する関数を再
帰関数を用いて作成せよ。
練習問題
• ユークリッドの互除法を用いて最大公約数を
求める関数を作成せよ。
• ヒント:24と64の最大公約数
– 64%24 → 16
– 24%16 → 8
– 16%8 → 0
演習問題
• 格子の中で、点から点へは
– 上または右にしか進めないとする。
• 任意の(x0,y0)から任意の(x1,y1)までの経路が何
通りあるか計算するプログラムを作成せよ。
(x1,y1)
(x0,y0)