一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)
本题是递归算法的一种运用,在做题目的时候可以先思考可否用递归。然后找到递归出口,接下来找到递归关系。
在这个题目中,只有一个台阶的时候有一种跳法,两台阶的时候有两种跳法分别是:1 1; 2;,三台阶有3中跳法,分别是 1 1 1;1 2;2 1;四台阶有五种跳法,分别是 1 1 1 1;1 2 1;1 1 2; 2 2;大家可以按照这个依次推下去,可以得出第n个台阶跳法是它前两个台阶的跳法之和。
int jumpFloor(int number ) {
if(number==1) //递归出口
return 1;
else if(number==2) //递归出口
return 2;
else
return jumpFloor(number-1)+jumpFloor(number-2);//递归关系
}
这个是牛客上的一个题目,大家可以找上面多找相关的题目来训练。加深对递归的理解运用。
https://www.nowcoder.com/practice
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
void hanocci(int n, char A, char B, char C)//有n个圆盘 三个柱子分别为A,B,C
{
if (n == 1)
{
printf("%c -> %c\n", A,C);
}
else {
hanocci(n - 1, A ,C, B);//第n-1个跳过柱子C,从柱子A移动到柱子B
printf("%c -> %c\n", A, C);
hanocci(n - 1, B, A, C);//第n-1个跳过柱子A,从柱子B移动到柱子C
}
}
int main() {
printf("输入盘子数:\n");
int n;
scanf("%d",&n);
hanocci(n, 'A', 'B', 'C');//n个盘子,柱子分别为A,B,C
system("pause");
return 0;
}