目录
1.什么是函数递归
函数递归,就是函数调用自己。
2.函数递归的约束条件
1.函数递归存在结束条件,满足该条件结束递归。
2.函数每次递归参数就越来越靠近结束条件。
3.函数递归的有关题
3.1 斐波那契数列
输出第N个斐波那契数
1.递归版
#inlcude <stdio.h>
int Fib(int n)
{
if(n<=2)
return 1;
return Fib(n-1) + Fib(n-2);
}
int main()
{
int num = 0;
scanf("%d",&n);
printf("%d",Fib(n));
return 0;
}
2.非递归版
#inlcude <stdio.h>
int Fib(int n)
{
int a = 1;
int b =1;
int c =1;
while(n)
{
c = a + b;
a = b;
b = c;
n--;
}
}
int main()
{
int num = 0;
scanf("%d",&n);
printf("%d",Fib(n));
return 0;
}
3.2 兔子生崽
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)。这其实是一道斐波那契数列的变种练习题。
#include <stdio.h>
int Fib(int month)
{
if (month <= 1)
return 1;
return Fib(month - 1) + Fib(month - 2);
}
int main()
{
int month = 0;
scanf("%d",&month);
int sum =test(month);
printf("%d", sum);
return 0;
}
3.3 小青蛙跳台阶
有一只青蛙,一次可以调一层或两层台阶,输入一个数n,代表有n层台阶,请问一共有多少种跳法。
如果第一次跳一层台阶的话,还剩(n-1)层台阶
如果第一次跳两层台阶的话,还剩(n-2)层台阶
我们只要将剩余的(n-1)层和(n-2)层台阶加起来,就可以得到总共的跳法。
#include <stdio.h>
int Jump(int n)
{
if (n == 1)
return 1;
else if (n == 2)
return 2;
else
return Jump(n - 1) + Jump(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int sum = Jump(n);
printf("%d", sum);
return 0;
}
3.4 汉诺塔
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
#incude <stdio.h>
//n 代表 有多少个盘子
//A 代表 起始位置
//B 代表 中转位置
//C 代表 终点位置
void move(char A,char B)
{
printf("%c -> %c ",A,B);
}
void Hanoi(int n,char A,char B,char C)
{
if(n == 1)
{
move(A,C);
}
else
{
Hanoi(n-1,A,C,B);
move(A,C);
Hanoi(n-1,B,A,C);
}
}
int main()
{
int n = 0;
scanf("%d",&n);
Hanoi(n,'A','B','C');
return ;
}