汉诺塔问题与函数递归调用
2个盘子时:
1、AB 2、AC 3、BC
4、AC 5、BA
6、BC 7、AC 2个盘子 从BC
}
10
应用实例
4个盘子时:
1、2个盘 子从AC 2、AB
函数源程序如下:
1、AB 2、 AC 3、B C 4、AB 5、CA 6、 CB 7、A B 8、AC 1、2个盘 子从BA 2、BC 3、2个盘 子从AC 9、BC 10、 BA 11、C A 12、BC
算法设计如下:
1、编写求年龄的函数age; 2、判断n=1时,返回值3; 3、判断n≥2时,函数age调用age(n-1)+2; 4、编写主调函数,调用递归函数。
函数程序如下:
int age(int n) { if(n==1) //求年龄函数 return 3;
else return age(n-1)+2; }
} void hanoi(int n,char A,char B,char C) { if(n==1) printf("%c -> %c\n",A,C);
1、3个盘 子从AB
3、2个盘 子从CB
2、AC
3、3个盘 子从BC
13、AB 14、 AC 15、B C
11
应用实例
函数源程序如下: 多个盘子算法设计如下:
9+2=11
7+2=9 5+2=7 3+2=5
age(2)+2
age(1)+2
3
第五个小朋友的年龄为11岁
5
应用实例
【汉诺塔游戏】 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求将 所有圆盘移至C杆。移动的过程始终保持大盘在下,小盘在上的原则。
A
C
B
6
应用实例
【汉诺塔游戏】 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求将 所有圆盘移至C杆。移动的过程始终保持大盘在下,小盘在上的原则。
实例分析如下:
1、AC
A
C
B
7
应用实例
【汉诺塔游戏】 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求将 所有圆盘移至C杆。移动的过程始终保持大盘在下,小盘在上的原则。
3
A->C A->B C->B A->C B->A B->C A->C
12
总结
SUMMARY
1 2 3
单击此处添加文字内容 案例引入递归调用定义 单击此处添加文字内容 案例分析使用递归实现
单击此处添加文字内容 递归调用应用实例
谢谢!
1、把n-1个盘子由A B 2、把第n个盘子由AC 3、把n-1个盘子由B C
运行结果
void hanoi(int n,char A,char B,char C) { if(n==1) printf("%c -> %c\n",A,C); else { hanoi(n-1,A,C,B); printf("%c -> %c\n",A,C); hanoi(n-1,B,A,C); } } main() { int n; scanf("%d",&n); hanoi(n,'A','B','C'); } //主函数
2个盘子从AB
2个盘子从BC
6、BC
7、AC A C B
9
应用实例
函数源程序如下:
语句编写
只有1个盘子时:
1、AC
3个盘子时:
1、AC 2、AB 3、CB 2个盘子 从AB
void hanoi(int n,char A,char B,char C) { if(n==1) printf("%c -> %c\n",A //求年龄函数 { if(n==1) return 3; else return age(n-1)+2; } main() //主函数 { int fage; fage=age(5); printf(“第五个小朋友的年龄为%d岁\n",age); }
运行结果
案例引入
【猜年龄】
3岁
比第1个大2岁 比第2个大2岁 比第3个大2岁 比第4个大2岁
age(1)+2
age(2)+2
age(3)+2
age(4)+2
第5个小朋友几岁?
2
案例分析
递归调用定义:
一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。
3
案例分析
递归函数调用定义:
一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。
实例分析如下:
1、AB 2、AC 3、BC
A
C
B
8
应用实例
【汉诺塔游戏】 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求将 所有圆盘移至C杆。移动的过程始终保持大盘在下,小盘在上的原则。
实例分析如下:
1、AC 2、AB 3、CB 4、AC 5、BA
//递归函数调用自身
main() //主函数 { int fage; fage=age(5); printf(“第五个小朋友的年龄为%d岁\n",fage); }
4
案例实现
递归函数调用定义:
一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。
源程序如下:
语句编写
调用过程如下:
age(5)=age(4)+2