递归——汉诺塔问题
作者:互联网
递归的两个特点
-
调用自身
-
结束条件
-
eg
#include<stdio.h>
void func1(int x) //没有结束条件,不是递归
{
printf("%d", x);
func1(x - 1);
}
void func2(int x) //没有结束条件,不是递归
{
if (x > 0)
{
printf("%d", x);
func2(x + 1);
}
}
void func3(int x) //递归结果:321
{
if (x > 0)
{
printf("%d", x);
func3(x - 1);
}
}
void func4(int x) //递归结果:123
{
if (x > 0)
{
func4(x - 1);
printf("%d", x);
}
}
int main()
{
//func1(3);
//func2(3);
func3(3);
func4(3);
return 0;
}
递归实例:汉诺塔问题
-
大梵天创造时间的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小首先摞着64片黄金圆盘。
-
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
-
在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
-
64个圆盘移动完毕之日,就是世界毁灭之时
当n=2时
n个盘子时
-
代码实现
#include<stdio.h>
void hanoi(int n, char A, char B, char C)
{
if (n > 0)
{
hanoi(n - 1, A, C, B); //第一步
printf("moving from %c to %c\n", A, C); //第2步
hanoi(n - 1, B, A, C); //第三步
}
}
int main()
{
hanoi(3, 'A', 'B', 'C');
return 0;
}
输出结果
moving from A to C
moving from A to B
moving from C to B
moving from A to C
moving from B to A
moving from B to C
moving from A to C
-
汉诺塔移动次数的递推式:h(x)=2h(x-1)+1
-
h(64)=18446744073709551615
-
假设婆罗门每秒钟搬一个盘子,则总共需要5800亿年!
标签:递归,int,void,问题,圆盘,moving,printf,汉诺塔 来源: https://blog.csdn.net/m0_62080641/article/details/122146997