函数递归:一个函数直接或者间接在函数内调用自己,称这个函数是递归定义的;
//n! = n*(n-1)!
//5! = 5*4!
//4! = 4*3!
//3! = 3*2!
//2! = 2*1!
//1! = 1; //base case
//递归通常分为三个阶段: 递归前进段,递归边界条件,递归后退段
//long func(int n)//
//{
// if (n==1) {//递归退出条件
// return 1;
// }
// return n*func(n-1);
//}
//
//int main(int argc, const char * argv[]) {
//
// printf("%ld ", func(12));
//
// return 0;
//}
//斐波那契数列
//1 1 2 3 5 8 13 21 34 55 89 144 ....
//int feibonaqi(int n)
//{
// if (n==1 || n==2) {
// return 1;
// }
// return feibonaqi(n-1)+feibonaqi(n-2);
//}
//
//int main(int argc,const char *argv[])
//{
// for (int i=1; i<=40; i++) {
// printf("%d ", feibonaqi(i));
// }
// printf(" ");
// return 0;
//}
//1、编写递归函数求两个正整数a和b的最大公约数(GCD,Greatest Common Divisor),使用Euclid算法:
//
//如果a除以b能整除,则最大公约数是b。
//
//否则,最大公约数等于b和a%b的最大公约数。
//
//Euclid算法是很容易证明的,请读者自己证明一下为什么这么算就能算出最大公约数。最后,修改你的程序使之适用于所有整数,而不仅仅是正整数。
//int euclid(int a, int b)
//{
// if (!(a%b)) {
// return b;
// }
// return euclid(b, a%b);
//}
//
//int main(int argc,const char *argv[])
//{
//
// printf("%d ", euclid(319, 377));
// return 0;
//}
//2、 趣味问题——年龄。有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?用递归算法实现。
int age(int n)
{
if (n==1) {
return 10;
}
return age(n-1)+2;
}
int main(int argc, const char *argv[])
{
printf("age = %d ", age(6));
return 0;
}