hello,各位小伙伴们上次我们复习了C语言小tip之函数递归,这次我们来使用函数递归来完成青蛙跳台阶和汉诺塔问题!
青蛙跳台阶问题
青蛙跳台阶问题:一只青蛙跳n阶台阶,一次可以跳1阶或者两阶,问有多少种情况!
如果跳1节台阶的话,只有一种情况,如果跳2节台阶的话,有两种情况一次跳一阶,或者一次性跳两阶。如果跳3节台阶的话,可以选择一次跳一节,或者第一次跳一节,第二次跳两节或者第一次跳两节,第二次跳一节。共有3中情况!
我们可以将3节台阶拆分成:一节台阶和两节台阶,两种情况的总和便是3节台阶的情况,如果有n节台阶,可以拆分成:一节台阶和n-1节台阶,在将n-1节台阶拆分成1节台阶和n-2节台阶,以此拆下去,直到拆分成只剩下1节台阶和2节台阶,将前面的几种情况相加便是跳n节台阶的情况!
代码实现:
#include<stdio.h>
int jump(int num)
{
if (num == 1)
return 1;
else if(num == 2)
return 2;
else
{
return jump(num - 1) + jump(num - 2);
}
}
int main()
{
int num = 0;
printf("亲输入台阶数");
scanf("%d", &num);
int ret = jump(num);
printf("%d", ret);
return 0;
}
汉诺塔问题
汉诺塔游戏的规则:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。 操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
如果只有1个盘子的话,只需要将盘子从A移动到C,只需要一步就可以。A ->C
2个盘子:先将第一个小盘子从A上移动到B上,再将下面的盘子从A移动到C上,最后将B上的小盘子移动到C上。A ->B,A -> C,B -> C
3个盘子:
我们可以这样考虑,先将n-1个盘子通过B柱和C柱交换到B柱上,在将A上的A -> C,A -> B,C -> B,A -> C,B -> A,B -> C,A ->C盘子移动到C柱上,组后再将B柱上的盘子通过A柱和C柱移动到C柱上,将n个盘子拆分成1个盘子和n-1个盘子,在将n-1个盘子继续拆分,直到拆分成1个盘子和2个盘子!
让我们一起来看看代码是如何实现的吧
#include<stdio.h>
void move(char pos1, char pos2)
{
printf(" %c -> %c ", pos1, pos2);
}
void hanoi(int num,char pos1,char pos2,char pos3)//起始位置,中转位置,终点位置
{
if (num == 1)
move(pos1, pos3);
else
{
hanoi(num - 1, pos1, pos3, pos2);
move(pos1, pos3);
hanoi(num - 1, pos2, pos1, pos3);
}
}
int main()
{
int num = 0;
printf("请输入盘子的个数");
scanf("%d", &num);
hanoi(num,'A','B','C');
return 0;
}
OK,本期关于函数递归就到这里啦,各位小伙伴们再见!