1.汉诺塔问题
先来介绍一下什么叫汉诺塔问题,
如图,要将A柱子上的圈圈移动到C柱子上面,要求一次只能移动一个圈,且大的圈必须在下面,小的圈必须在上面。
1. 先把A中的前7个圈移动到B中,在将最大的圈移到C中,则实现了最大圈的移动。
2.要实现7个圈移到B中,则需先把前6个圈,移到C中,则实现第7个圈移到B中。
3.要实现第6个圈移到C中,则需先把前5个圈移到B中,则实现第6个圈的移动。
依次类推,每次移动都依靠空余的柱子完成。
代码实现:
void Hanoi(int n, char A, char B, char C)
{
if (n == 1)
{
printf("%c--->%c\n", A, C);//个数为1,则将A--->C
}
else
{
Hanoi(n - 1, A, C, B);//将n-1个圈先从A移到B,
printf("%c--->%c\n", A, C);//将最后一个圈从A--->C
Hanoi(n - 1, B, A, C);//将B中n-1个圈中,先借助A来移动到C上
}
}
int main()
{
int n = 0;
printf("请输入圈圈个数:");
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C');
system("pause");
return 0;
}
输出结果如下,假设n为3:
打印出交换的步骤。
2.青蛙跳台阶问题
题目:n个台阶,1次可以跳1个台阶,1次也可以跳2个台阶,这只青蛙跳到第你个台阶,有多少种跳法?
当n=1时,只有一种跳法;
n=2时,有2种跳法;
n=3时,有3种跳法;
n=4时,有5种跳法;
n=6时,有8种跳法;有没有发现规律呢?后面一次的跳法等于前两次的跳法种类相加。
即斐波那契数列(兔子数列);
如果用函数递归来实现的话,重复计算的次数太多,当n超过50左右时,会栈溢出。
int fab(int n)//重复次数多,运算量大
{
if (n <= 2)
return 1;
else
return fab(n - 1) + fab(n - 2);
}
int main()
{
int n = 0;
int ret = 0;
scanf_s("%d", &n);
//TDD-测试驱动开发
ret = fab(n);
printf("%d", ret);
return 0;
}
可以考虑用循环的方式实现:
int fab(int n)
{
int a = 1;
int b = 1;
int c = 0;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;//n为什么要--,为了终止循环,每前进一次,次数少一次,直到算出结果
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
scanf_s("%d", &n);
//TDD-测试驱动开发
ret = fab(n);
printf("%d", ret);
return 0;
}