`
xitong
  • 浏览: 6194218 次
文章分类
社区版块
存档分类
最新评论

递归算法-基于归纳法

 
阅读更多


在递归算法的设计思想里面,可以把递归算法分为两种大的类型,一种是基于归纳法的递归,另一种是基于分治法的递归。前者是将数学里面的归纳法,最终归于一个基础项的计算思想应用到算法设计中而形成的,后者则是把一个问题分成多个子问题进行求解。本篇博文讨论前者-基于归纳法的递归算法。


1, 基本思想方法


对于一个问题规则为n的问题P(n),归纳法的思想方法是:

1)基础步:a1是问题P(1)的解。

2)归纳步:对所有的k,1<k<n,若b是问题p(k)的解,则P(b)是问题p(k+1)的解。其中P(b)是对b的某种运算或处理。


这个论断大家应该都熟悉,在高中数学里经常用归纳法证明一个数学问题,就是当n=k(=1,2)时,给定结论满足。假定当k时也满足,然后证明k+1时也满足,这个原理基本上是一样的。


2,递归算法的例子


一个最为大家所熟知的例子就是计算阶乘,如下所述:


2.1 计算阶乘函数n!

输入:n

输出:n!

int factorial(int n){
     if(n==0)
           return 1;
     else
           return n*factorial(n-1);
}

2.2 基于递归的插入排序

基于这个的思想进行递归:

1)基础步:当n=1时,数组只有一个元素,它已经是排序的。

2)归纳步:如果前面k-1个元素已经排序的,则插入第k个元素,只需要将第k个元素与前面的k-1个

输入:数组A[],数组的元素个数n;

输出:按递增顺序排序的数组A[];

void insert_sort_rec(int a[],int n){
      int k;
      int m;
      n=n-1;
      if(n>0){
             insert_sort_rec(a,n);
             m=a[n];
             k=n-1;
             while( (k>=0)&&a[k]>m)){
                 a[k+1]=a[k];
                 k=k-1;
              }
              a[k+1]=a
       }
}

3,排列问题的递归算法


该问题的描述是生成n个数的所有排列。用递归可以采取以下步骤:

1)数组第一个元素为1,即排列的第一个元素为1,生成后面的n-1个元素的排列。

2)排列的第一个元素为2,生成后面的元素排列。

就这样继续,最后排列的第一个元素为n。

然后对于第一个元素为1的排列,再假定第二个元素为2,生成后面n-2个元素的排列,假定第二个元素为3....,有:

基础步:k=1时,只有一个元素,已经构成一个排列。

归纳步:对任意的k(1<k<=n),如果可由算法完成k后面的k-1个元素排序,问题就得到解决。


输入:数组a[],数组的元素个数n, 当前递归层次完成排列的元素个数k.

输出:数组a[]的所有排列。


void perm(int a[],int k,int n){
     int i;
     if(k==1){
         for(i=0;i<n;i++)
              printf("%d-",a[i]);
     }else{
         for(i=n-k;i<n;i++){
              swap(a[i],a[n-k]);
              perm(a,k-1,n);
              swap(a[i],a[n-k]);
         }
     }
}


分享到:
评论

相关推荐

    递归与分治算法的设计

    递归小结 •优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 •缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归...

    算法艺术-分治与递归

    快速排序的分治思想 时间复杂度分析 数学归纳法 Karatsuba快速乘法 Strassen矩阵乘法

    e语言-易语言算法文档电子书下载

    资源介绍:本书介绍了常用算法设计。包括列举法,递推法,递归算法,归纳法,排序算法,贪婪算法,还有一些例程。资源作者:

    java数学归纳法非递归求斐波那契数列的方法

    主要介绍了java数学归纳法非递归求斐波那契数列的方法,涉及java非递归算法的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    分析和计算算法效率的便捷方法.pdf

    归纳出频度统计法、频度估算法、频度未知数法、列举频度归纳法、频度期望值法、扩展递归迭代法、上下限猜测法等几种根据算法特性求解时间复杂度的方法.这些方法涵盖了大多类算法,无论是在软件设计,还是在教学实践中,...

    算法设计技巧与分析 电子工业出版社

    第5章 归纳法 第6章 分治 第7章 动态规划 第三部分 最先割技术 第8章 念心算法 第9章 图的遍历 第四部 问题复杂性 第10章 NP完全问题 第11章 计算机杂性引论 第12章 下界 第五部分 克服困难性 第13章 回溯...

    算法导论学习笔记三之分治法与递归式解法

    NULL 博文链接:https://deepin.iteye.com/blog/1390131

    计算机程序设计常用算法归纳.pdf

    4、有序数列的插入、删除操作 5、求解算法(最大数、最小数、素数、最大公约数、最小 公倍数) 6、矩阵的处理(生成矩阵、交换和基本运算) 7、递归算法(求阶乘、最大公约数) 8、字符串处理(插入、删除、连接和...

    算法导论(part2)

    ·读者应该能较为熟练地利用数学归纳法进行证明。书中有一些内容要求读者具备初等微积分方面的知识。除此之外,本书的第一部分和第八部分将介绍读者需要用到的所有数学技巧。 致使用本书的专业技术人员 本书涉及的...

    数据结构与算法.DOC

    算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。 算法复杂度:算法时间复杂度和算法空间复杂度。 算法时间复杂度是指执行算法所需要的计算工作量。 算法空间复杂度是指执行这个算法所需要的...

    IOI国家集训队论文集1999-2019

    + [数学归纳法](#数学归纳法) + [多项式](#多项式) + [数形结合](#数形结合) + [黄金分割](#黄金分割) * [其他算法](#其他算法) + [遗传算法](#遗传算法) + [信息论](#信息论) + [染色与构造](#染色与构造) ...

    算法导论(part1)

    ·读者应该能较为熟练地利用数学归纳法进行证明。书中有一些内容要求读者具备初等微积分方面的知识。除此之外,本书的第一部分和第八部分将介绍读者需要用到的所有数学技巧。 致使用本书的专业技术人员 本书涉及的...

    单向链表基本操作的递归实现

    这几天正在复习一些基本的算法和实现,今天看了看递归的基本原理,发现自己对递归还不是特别清楚,特别是不清楚递归的思想,不能很准确的把握先分解成小事件,在合并的思想,其实也是数学归纳法的程序体现,其实数学...

    程序设计抽象思想:C语言描述-

     7.6 数学归纳法  7.7 小结  7.8 复习题  7.9 编程练习  第Ⅲ部分 数据抽象  第8章 抽象数据类型  ……  第9章 效率与ADT  第10章 线性结构  第11章 符号表  第Ⅳ部分 递归数据  第12章 递归链表  第13...

    数据结构与算法基础知识总结.doc

    算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。 算法复杂度:算法时间复杂度和算法空间复杂度。 算法时间复杂度是指执行算法所需要的计算工作量。 算法空间复杂度是指执行这个算法所需要的...

    基于决策树算法的空气质量预测系统

    而基于决策树算法的空气质量评估模型通过采用自顶向下的递归方式对数据进行处理,把一个无序、无规则的实例集合归纳成一组树形结构表示的分类规则,得到了将所有污染参数作为评估空气质量因素的评估模型,可以有效的...

    静态查找法实现管道铺设中的最小生成树问

    good)——图 15. 利用深度或广度优先搜索求...20. 递归算法与非递归算法的比较与复杂度分析(实例说明,具体数据) 21. 一种查找算法的改进及性能分析(实例说明,具体数据) 22.哈希表在字符串操作中的应用(字符串

    递归与分治策略(从概念原理到多个实例的详细讲解)

    递归与分治策略,其中有用到数学归纳法。阶乘函数,Fibonacci数列,基于递归的插入排序,时间递归方程和复杂性分析,整数划分问题,Hanoi塔问题,分治法的适用条件,二分搜索算法,大整数的乘法,Strassen矩阵乘法,...

    初识人工智能--决策树算法.pdf

    每个队夺冠的⼏率不是相等的 ⽐特(bit)来衡量信息的多少 变量的不确定性越⼤,熵也就越⼤ 3.1 决策树归纳算法 (ID3) 1970-1980, J.Ross. Quinlan, ID3算法 选择属性判断结点 信息获取量(Information Gain):Gain...

    数据结构与算法知识点必备.doc

    算法设计的基本方法:列举法、归纳法、递推、递归、减半递推技术、回溯法 5. 算法的复杂度主要包括:时间复杂度、空间复杂度 6. 算法的时间复杂度:指执行算法所需要的计算工作量 7. 算法的空间复杂度:指执行这个...

Global site tag (gtag.js) - Google Analytics