第二章 递推算法

递推法的特点

一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已知条件,此种方法叫逆推。无论顺推还是逆推,其关键是要找到递推式。这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重复处理的特点。

递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。递推算法避开了求通项公式的麻烦,把一个复杂的问题的求解,分解成了连续的若干步简单运算。一般说来,可以将递推算法看成是一种特殊的迭代算法。

 

 

例题(递推):

数字三角形。如下所示为一个数字三角形。请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。
   1、 一步可沿左斜线向下或右斜线向下走;
   2、 三角形行数小于等于100;
   3、 三角形中的数字为0,1,…,99;
   测试数据通过键盘逐行输入,如上例数据应以如下所示格式输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

思路:

从递推的思想出发,设想,当从顶层沿某条路径走到第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[1][1] 即为所求的数字总和的最大值。

代码:

#include<iostream>
using namespace std;
int main()
{
  int n,i,j,a[101][101];
  cin>>n;
  for(i=1;i<=n;i++)
   for(j=1;j<=i;j++)
     cin>>a[i][j];                             
  for(i=n-1;i>=1;i--)
   for(j=1;j<=i;j++)
   {
       if(a[i+1][j]>=a[i+1][j+1])  
           a[i][j]+=a[i+1][j];    
       else a[i][j]+=a[i+1][j+1];
   } 
  cout<<a[1][1]<<endl; 
}

 

例题(斐波那契数列)

满足F1=F2=1,Fn=Fn-1+Fn-2的数列称为斐波那契数列(Fibonacci),

它的前若干项是1,1,2,3,5,8,13,21,34……求此数 列第n项(n>=3)。

即:f1=1(n=1)        f2=1(n=2)        fn=fn-1 + fn-2(n>=3)

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int f0=1,f1=1,f2;
    int n;
    cin>>n;
    for(int i=3;i<=n ++i)
    {
         f2=f0+f1;
         f0=f1;
         f1=f2;
    }
    printf("%d\n",f2);
    return 0;
} 

 

 

递推算法是一种通过已知的前一项值来推导出下一项值的数学算法。在计算机科学中,递推算法常用于解决循环或递归问题,通过将较大的问题拆解成较小的子问题来求解。 第三章讲解了递推算法的实现方法和应用场景。在C语言中,递推算法可以通过循环结构来实现。比如,斐波那契数列是一个经典的递推算法问题。通过定义前两项的初值为1,然后通过循环不断计算出下一项的值,最终得到一个斐波那契数列。 下面是一段使用递推算法计算斐波那契数列的C语言代码: ```c #include <stdio.h> int fibonacci(int n) { int a = 1; int b = 1; int c; if (n < 1) { return -1; // 输入不合法,返回错误代码 } else if (n < 3) { return 1; // 第一项和第项的值为1 } for (int i = 3; i <= n; i++) { c = a + b; a = b; b = c; } return b; } int main() { int n = 10; int result = fibonacci(n); printf("第%d项的值为:%d\n", n, result); return 0; } ``` 通过循环计算,上述代码可以输出斐波那契数列的第10项的值为55。 递推算法在实际应用中还有很多其他的用途。比如,可以用递推算法来解决排列组合问题、动态规划问题等。在编程中,递推算法的优势在于其简单高效的计算方法,能够较快地求解问题。然而,有时候递推算法需要注意边界条件和初始值的设定,以避免出现错误的结果。 总结起来,递推算法是一种通过已知的前一项值来推导出下一项值的数学算法。在C语言中,递推算法可以通过循环结构来实现。递推算法在计算机科学中有着广泛的应用,能够简化问题求解的过程,提高计算效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值