java走楼梯递归,走楼梯递归递推的算法总结

走楼梯的算法总结

(1).一次可以走一阶或两阶

(2).一次可以走一阶或两阶或三阶

(3). 一次可以走一阶或两阶,最终走偶数步,或者奇数步

两种实现方式

(1).递归

(2).递推

(1)递归的思想:就是一个问题可以拆分成他的子问题

子问题和原问题有相同的结构

每一次缩小一次问题的规模,规模最小的时候就是递归函数的出口

一层递归调用结束后会返回给上一层,

依次类推,等到压栈的函数全部出栈递归调用结束

递归其实是利用栈的后进先出来实现功能的

(2)递推的算法的思想:每一步都是由它的上一步推过来的,一步一步的去算,找规律,用数组去实现。

int f(int n) //递归(1)

{

if (n==1) //递归函数的出口

return 1;

if (n==2) //递归函数的出口

return 2;

return f(n-1)+f(n-2);

}

递归(2) int f(int n)

{

if (n==1)

return 1;

if (n==2)

return 2;

if (n==3)

return 4;

return f(n-1)+f(n-2)+f(n-3);

}

int main ()

{

int i=f(3);

printf ("%d\n",i);

return 0;

}

/*

等下次我再介绍一下汉诺塔问题,双重递归比较的复杂难懂。

而搞懂这些问题,才会对数据结构中的树,有更清晰的认识。

*/

下面是递推算法的实现

# include

using namespace std;

const int maxn=1000;

//(1).一次可以走一阶或两阶

//(2).一次可以走一阶或两阶或三阶

//(3).一次可以走一阶或两阶,总共要走偶数步

//求一共有多少种方法。

//int f[1000];

//(1)

int main ()

{

int n;

f[1]=1;

f[2]=2;

for (int i=3;i<=100;++i)

f[i]=f[i-1]+f[i-2];

printf ("%d\n",f[5]);

return 0;

}

//(2)

int main ()

{

int n;

f[1]=1;

f[2]=2;

f[3]=4;

for (int i=4;i<=100;++i)

f[i]=f[i-1]+f[i-2]+f[i-3];//每一次都是用它的上一步去推出来的。

//这一步可以选择走一步或者两步或者三步。

printf ("%d\n",f[5]);

return 0;

}

//(3)

int main ()

{

int f[100][2];

memset (f,0,sizeof(f));

f[1][0]=1;

f[1][1]=0,f[2][0]=1,f[2][1]=1; //0代表偶数,1代表偶数,先把前面的项推出来。

for (int i=3;i<=100;++i)

{

f[i][0]=f[i-1][1]+f[i-2][1]; //第i阶是偶数,那么i-1阶,i-2阶肯定是奇数了,依次类推。

f[i][1]=f[i-1][0]+f[i-2][0];

}

printf ("%d\n",f[5][1]);

return 0;

}

/*

递推的算法就是找规律的,堆骨牌问你一共有多少种方法也是如此的,这一步是依据他的上一步来的。

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值