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));
}
関数の中で引数を変更する
#include <stdio.h>
void foo3(int x, int y)
{
x=3;
y=4;
}
void foo4(int *x, int *y)
{
*x=6;
*y=8;
}
void main()
{
int a=0,b=0;
foo3(a,b);
printf(“%d %d\n”,a,b);
foo4(&a,&b);
printf(“%d %d\n”,a,b);
}
問題
• 数の並び替えをしてみよう。
• 4,1,2,3,6 を小さい順に並び替える。
4 1 2 3 6
1 4 2 3 6
手順
1. 最小値を見つけ、これを左端にもってくる。
2. 二番目に小さい値を見つけ、これを左から二
番目におく。
3. 三番目に。。。
最小値を見つけ、これを左端にもってくる。
for(i=1;i<n;i++){
もし data[i] が data[0] よりも小さければ
入れ替える。
}
1 2 4 3 6
2つの数字を入れ替える関数を作れば便
利。
my_swap(&a,&b)
1 2 3 4 6
2番目、3番目に小さい数字に対して、「最
小値を見つけ、これを左端にもってくる。 」
ような処理をするには、どうすればいい
か?
#include <stdio.h>
void my_swap(int *a,*b)
{
}
void my_sort()
{
}
void main()
{
並び替えるデータを乱数で作成する。;
/*
並び替えをする関数を呼び出す。 */
my_sort();
並び替えた結果を出力する。;
}
再帰関数
• 再帰
– 動作の対象が動作主そのもの。
• 主語 = 目的語
– 彼は自分のことが好きだ。
– 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