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


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

猜你喜欢

转载自blog.csdn.net/wcgwww/article/details/85047704
今日推荐