编程学习笔记5--递推的运用

递推是常用的办法,过去印象深刻的比如求n的阶乘,把一个数字逐位输出,汉诺塔实验都是递归的运用案例。递归是递推的一种特殊方式。

递归最重要的是找到结束条件,还有上层关系和下层之间的递推关系,尤其对于某些无法写出通项公式的题目,或者很难写出通项公式的题目,使用递归可以使代码变的简洁,易懂,比如二叉树的遍历中,递归输出明显比非递归容易理解的多,斐波那契数列,通项函数的计算需要解差分方程,很麻烦。用递归也是不错的办法,所有的递归都是

可以用循环实现的,但是递归的效率比较低。

楼梯问题

/**求有20级楼梯,每步可以跨一级也可以跨二级,走到第20级共有多少种走法?*/

分析:
20级的楼梯太多,逐一列举不可能,可以试着减少楼梯数目,从1开始,逐一列举,
回发现其实就是斐波那契数列。

比如走10阶楼梯,第一次有两种走法。

如果第一次走了两个,那么剩下的就是8个
如果第一次走了一个,那么剩下的就是9个

走10个楼梯的方法就是走9个楼梯和8个楼梯的和

如果再加上一次可以走3个阶梯,下面是办法,同样是递推累加
#include 
int main( )
{    int x,n,i,a,b,c;
	scanf("%d",&n);
	  a=1; b=2; c=4;
     if (n==1) x=1;
		else if (n==2) x=2;
	    		else if (n==3)  x=4;     
     for (i=4; i<=n; i++)
     {	x=a+b+c;  a=b; b=c; c=x; } 	
     printf("%d",x);
return 0;
} 

斐波那契数列

#include
int main( )
{
    int a,b,i;
    a=1;
    b=1;
    printf("%10d%10d",a,b);
    for (i=1; i<=5; i++)
    {
        a=a+b;
        b=a+b;
        printf("%10d%10d",a,b);
    }
    return 0;
}

门票排队问题

一场足球赛开始前,售票工作正在紧张的进行中,每张球票为50元。现有2n个人排队等待购票,其中有n 个人手持50元的钞票,另外n个人手持100元的钞票,假设开始售票时售票处没有零钱。问这2n个人有多少种排队方式,使售票处不至出现找不开钱的局面?
编程学习笔记5--递推的运用_第1张图片

//程序1:递推法
#include 
#define N 15
void main()
{	long int a[N+1][N+1]={0},i,j;
	for (i=1; i<=N;i++)
		a[i][0]=1;
	for (i=1; i<=N; i++)
		for (j=1; j<=N; j++)
			if (j>i) a[i][j]=0;
			     else a[i][j]=a[i-1][j]+a[i][j-1];
	printf("%ld",a[N][N]);
}

//程序2:递推法
#include 
#define N 15
void main( )
{	long int a[N+1][N+1]={0},i,j; 
	for (i=1; i<=N;i++)
		a[i][1]=i;
	for (i=2; i<=N; i++)
		for (j=2; j<=i; j++)
			 a[i][j]=a[i-1][j]+a[i][j-1];
	printf("%ld",a[N][N]);
}
//程序3:递归法
#include 
f(int a,int b)
/* a代表50元的人数,b代表100元的人数 */
{
  if (a

数字三角形

如下所示为一个数字三角形。请编一个程序计算从顶到底的某处的一条路径(一步可沿左斜线向下或右斜线向下走),使该路径所经过的数字总和最大。

编程学习笔记5--递推的运用_第2张图片

从递推的思想出发,可以设想,当从顶层沿某条路径走到第I层向第I+1层前进时,我们的选择一定是沿其下两条可行路径中最大数字的方向前进,为此,我们可以采用倒推的手法,设a[i,j]存放从i,j出发到达n层的最大值,则
 a[i,j]=max{a[i,j]+a[i+1,j] ,a[i,j]+a[i+1,j+1]}, 这样a[0,0] 即为所求的数字总和的最大 值。

#include 
void main()
{	int n,j,i,a[100][100];
	scanf("%d",&n);
	for (i=0; i=0;i--)
		for (j=0; j<=i; j++)
			if (a[i+1][j]>=a[i+1][j+1] )
				a[i][j]=a[i][j]+a[i+1][j];
			else    a[i][j]=a[i][j]+a[i+1][j+1];
	printf("%d",a[0][0]);
}






















你可能感兴趣的:(编程学习笔记5--递推的运用)