1 阶乘问题:n!
#include<stdio.h>
#include<stdlib.h>
int f(int n)
{
if(1==n)
{
return 1;
}
return n*f(n-1);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
printf("%d--%d\n",n,f(n));
}
system("pause");
return 0;
}
台阶问题
:一个人上台阶,台阶个数尾n个,一次只能走1个台阶或者2个台阶,问走到n个台阶总共有多少种走法(也和青蛙跳类似)
这里思想是:先想一下,如果走到只差一步就到第n个台阶,则此时到第n个台阶有两种:第一种就是走到第n-1个台阶,即step(n-1),下一跳走1个台阶;还有一种就是走到第n-2个台阶处,即step(n-2),下一跳走2个台阶,然后一直递归下去:
#include<stdio.h>
#include<stdlib.h>
int step(int n)
{
if(0==n ||1==n ||2==n)
{
return n;
}
return step(n-1)+step(n-2);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
printf("%d--%d\n",n,step(n));
}
system("pause");
return 0;
}
在青蛙跳台阶的问题中,如果把条件改成:一只青蛙一次可以跳上1级台阶,也可以跳上2级…它也可以跳上n级,此时该青蛙跳上一个n级的台阶总共由多少种跳法?Fn = 2^(n-1)
代码如下:
class Solution {
public:
int jumpFloorII(int number) {
int fin0 = 0;
int fin1 = 1;
int fin2 = 2;
int fin = 0;
if(number==0)
return 0;
if(number==1)
return 1;
if(number==2)
return 2;
for(int i=3;i <= number;i ++)
{
fin = 2*fin2;
fin2 = fin;
}
return fin;
}
};
汉诺塔问题
:共有三个底座ABC,底座上面放了n盘子,其中A座放了n个盘子,BC没有,现在要按照汉诺塔规则将A座n个盘子移动到C座。
首先也是看最后一个盘子的移动,分三步走:
1 将A上的n-1个盘子借助C座先移动到B座;
2 把A座最后一个盘子移动到C座;
3 将B座上面的n-1个盘子借助A座移动到C座;
#include<stdio.h>
#include<stdlib.h>
void hanoi(int n,char one,char two,char three);
void move(char x,char y);
int main()
{
int m;
scanf("%d",&m);
hanoi(m,'A','B','C');
system("pause");
return 0;
}
void hanoi(int n,char one,char two,char three)
{
if(1==n)
{
move(one,three);
}
else
{
hanoi(n-1,one,three,two);//将A上的n-1个盘子借助C座先移动到B座
move(one,three);把A座最后一个盘子移动到C座;
hanoi(n-1,two,one,three);将B座上面的n-1个盘子借助A座移动到C座;
}
return;
}
void move(char x,char y)
{
static int i=1;
printf("%d:%c-->%c\n",i,x,y);
i++;
return;
}
注:这里的代码学习来自与B站https://www.bilibili.com/video/BV1bQ4y1A7kB?from=search&seid=15217348207824790750