走楼梯的算法总结
(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 <bits/stdc++.h>
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;
}
/*
递推的算法就是找规律的,堆骨牌问你一共有多少种方法也是如此的,这一步是依据他的上一步来的。
*/