递归算法
- 定义:函数中可调用其他函数,递归特指函数中调用自身
- 注意点:需定义终止条件( if (...) 调用自身),否则会无休止下去
- 题型:汉诺塔、青蛙跳台阶、蜜蜂回家、求阶乘(也可用循环)
1. 汉诺塔问题:(拓展:对搬动次数计数)
有标记为1, 2, 3 的三根柱子,按规则摆放大小盘所需的步骤为:
step1: 将柱子1的 n-1 个盘移到柱子2上;属于间接移动,需借助柱子3
step2: 将柱子1的最后1个盘移到柱子3上;属于直接移动,无需借助其他柱子
step3: 将柱子2的 n-1 个盘移到柱子3上;属于间接移动,需借助柱子1
可认为终止条件为:
当 n=1 时,将柱子1的(最后)一个盘移到柱子2上;属于直接移动,无需借助其他柱子
#include <stdio.h> int main() { void zhijie_move(char a,char b);//直接移动只需一次,可不传递参数n void jianjie_move(int n,char a,char b,char c);
//间接移动需传递三个参数,否则后续调用函数时会少柱子 int n; scanf("%d",&n); jianjie_move(n,'1','2','3');//用字符类型标记柱子 return 0; } void zhijie_move(char a,char b)//用字符类型标记柱子 { printf("%c->%c\n",a,b); } void jianjie_move(int n,char a,char b,char c) { if(n==1) { zhijie_move(a,c); } else { jianjie_move(n-1,a,c,b);//step1 zhijie_move(a,c);//step2 jianjie_move(n-1,b,a,c);//step3 } }
2. 青蛙跳台阶:
青蛙跳上n级台阶分别所共有的方法数,恰好满足斐波那契数列;
故直接调用斐波那契数列函数 f (n) = f (n-1) + f (n-2),注意写明第一项和第二项的值。
#include <stdio.h> int feibo(int n) { int method; if(n==1) { method=1; } else if(n==2) { method=2; } else { method=feibo(n-1)+feibo(n-2); } return method; } int main() { int n,method; scanf("%d",&n); method=feibo(n); printf("%d",method); }
3. 蜜蜂回家
蜜蜂从最初点1号,到下一个点所共有的路线数,恰好满足斐波那契数列;
虽然起始点不一定从1号开始,但编号间隔相同则路线等价:
比如从1号到3号,与从3号到5号的蜂巢结构类似,则路线数相同。
也即,求从3号到5号的路线数时,直接求1号到3号的路线数,即为从1号到 (3-1+1) 的斐波那契数。
#include <stdio.h> int feibo(int point) { int route; if(point==1) { route=0; } else if(point==2) { route=1; } else if(point==3) { route=2; } else { route=feibo(point-1)+feibo(point-2);
//当point=1,2,3时,不会执行feibo(n-1)+feibo(n-1),因前面分支会抢先执行 } return route; } int main() { int a,b,route_a,route_b,route; scanf("%d%d",&a,&b); route=feibo(b-a+1);//间隔相同则线路等价,间隔加起始点1为终点编号 printf("%d",route); return 0; }
4. 求阶乘
递归步骤为:
n! = n * (n-1)!
可视终止条件为:
0! = 1
#include <stdio.h> int jiecheng(int n) { int plus; if(n==0) { plus=1; } else if(n==1) { plus=1; } else { plus=n*jiecheng(n-1);//比如5!=5*4! } return plus; } int main() { int n,plus; scanf("%d",&n); plus=jiecheng(n); printf("%d",plus); return 0; }
-END