递推法

转载 2008年09月28日 09:01:00

递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。设要求问题规模为N的解,当N=1时,解或为已知,或能非常方便地得到解。能采用递推法构造算法的问题有重要的递推性质,即当得到问题规模为i-1的解后,由问题的递推性质,能从已求得的规模为12,…,i-1的一系列解,构造出问题规模为I的解。这样,程序可从i=0i=1出发,重复地,由已知至i-1规模的解,通过递推,获得规模为i的解,直至得到规模为N的解。

【问题】       阶乘计算

问题描述:编写程序,对给定的nn100),计算并输出k的阶乘k!(k=12,…,n)的全部有效数字。

由于要求的整数可能大大超出一般整数的位数,程序用一维数组存储长整数,存储长整数数组的每个元素只存储长整数的一位数字。如有m位成整数N用数组a[ ]存储:

       N=a[m]×<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />10m-1+a[m-1]×10m-2+ +a[2]×101+a[1]×100

并用a[0]存储长整数N的位数m,即a[0]=m。按上述约定,数组的每个元素存储k的阶乘k!的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素……。例如,5=120,在数组中的存储形式为:

3

0

2

1

……

首元素3表示长整数是一个3位数,接着是低位到高位依次是021,表示成整数120

       计算阶乘k!可采用对已求得的阶乘(k-1)!连续累加k-1次后求得。例如,已知4=24,计算5!,可对原来的24累加424后得到120。细节见以下程序。

# include <stdio.h>

# include <malloc.h>

# define  MAXN   1000

void  pnext(int a[ ],int k)

{     int *b,m=a[0],i,j,r,carry;

       b=(int * ) malloc(sizeof(int)* (m+1));

       for ( i=1;i<=m;i++)        b[i]=a[i];

       for ( j=1;j<=k;j++)

       {     for ( carry=0,i=1;i<=m;i++)

              {     r=(i<a[0]?a[i]+b[i]:a[i])+carry;

                     a[i]=r%10;

                     carry=r/10;

              }

              if (carry)  a[++m]=carry;

       }

       free(b);

       a[0]=m;

}

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

void  write(int *a,int k)

{     int i;

       printf(“%4d=”,k);

       for (i=a[0];i>0;i--)

              printf(“%d”,a[i]);

printf(“/n/n”);

}

 

void main()

{     int a[MAXN],n,k;

       printf(“Enter the number n:  “);

       scanf(“%d”,&n);

       a[0]=1;

       a[1]=1;

       write(a,1);

       for (k=2;k<=n;k++)

       {     pnext(a,k);

              write(a,k);

              getchar();

       }

}

实用算法的分析与程序设计——递推法(顺推法)包含实例,代码

顺推法即由边界条件出发,通过递推关系式推出后项值,再由后项值按递推关系式推出再后项值。。。依次递推,直至从问题初始陈述向前推进到这个问题的解为止。实例代码#include #include using...
  • oMengLiShuiXiang1234
  • oMengLiShuiXiang1234
  • 2015年05月07日 19:19
  • 1083

基础算法-递推法

 实用算法(基础算法-递推法-01)      有一类试题,每相邻两项数之间的变化有一定的规律性,我们可将这种规律归纳成如下简捷的递推关系式:    Fn=g(Fn-1)    这就在数的序列中,建立...
  • liufei_learning
  • liufei_learning
  • 2010年02月02日 23:27
  • 2023

基本算法思想之递推算法思想(C++语言描述)

递推算法是非常常用的算法思想,在数学计算等场合有着广泛的应用。递推算法适合有明显公式规律的场合。   递推算法基本思想 递推算法是一种理性思维莫斯的代表,根据已有的数据和关系,逐步推到而得到结果。递推...
  • QianShouYuZhiBo
  • QianShouYuZhiBo
  • 2013年10月06日 22:26
  • 1493

ACM入门练习与递推小结

一些实用的套路需要了然于心。 查表法实例(点击进入->ACM查表): 1.HDU2004 成绩转换 2.I00030 Grades conversion 3.HDU1048 The H...
  • tigerisland45
  • tigerisland45
  • 2016年07月09日 19:33
  • 1288

ACM递推递归练习F计算组合数

思路:这个题也做过,但是前两次都是n和m颠倒了,看了好几次也没做对,让舍友看了,就改过了。 代码:#include using namespace std; int a(int n,int m)...
  • canomhan
  • canomhan
  • 2017年03月30日 20:31
  • 195

递归与递推——C-递归的函数,F-计算组合数

C-递归的函数,F-计算组合数用到了递归这个知识点,其中 C-递归的函数还要用到记忆化存储,否则程序运行会超时,我觉得这是一个有价值的题目,让我学会了以前不知道的方法。递归一开始接触起来不好理解,但慢...
  • qq_35739903
  • qq_35739903
  • 2017年04月03日 22:13
  • 110

luogu1115 最大子段和(递推/分治)

一直记着之前得到的能接着连下去的最大值tmp,始终更新答案ans。
  • Icefox_zhx
  • Icefox_zhx
  • 2017年07月31日 15:04
  • 115

算法:递推法

定义 即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法 分类1. 顺推法 :从已知条件出发,逐步推算出要解决问题的方法,图:斐波拉契数列。2. 逆推法 :从已知结果,用迭代表达式逐步推算出...
  • Bingsman
  • Bingsman
  • 2016年07月25日 11:07
  • 433

实用算法(基础算法-递推法-01)

推关系式:    Fn=g(Fn-1)    这就在数的序列中,建立起后项和前项之间的关系,然后从初始条件(或最终结果)入手,一步步地按递推关系递推,直至求出最终结果(或初始值)。很多程序就是按这样的...
  • andyhou
  • andyhou
  • 2007年03月12日 16:13
  • 1198

线性常系数差分方程的Matlab递推求解

%Matlab信号处理工具箱提供了filter函数,可以实现线性常系数差分方程的递推求解,调用格式如下:     %yn=filter(B,A,xn,xi)     %xi=filtic(B...
  • styxqdz
  • styxqdz
  • 2009年12月06日 22:18
  • 5216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:递推法
举报原因:
原因补充:

(最多只允许输入30个字)