zoukankan      html  css  js  c++  java
  • 第七章 (二)递归

    1.递归

    一个直接或间接调用自身的算法称为递归算法

    一个使用自身给出定义的函数称为递归函数

     

    2.应用

    如果问题的数据结构是递归的(如链表),问题的定义是递归的(如fibonacci数列),问题的解法是递归的(整数划分问题),可以考虑使用递归算法

    经典问题:汉诺塔问题:设有3根标号为A,B,C的柱子,在A柱上放着n个盘子,每一个都比下面的略小一点,要求把A柱上的盘子全部移到C柱上,移动的规则是:(1)一次只能移动一个盘子;(2)移动过程中大盘子不能放在小盘子上面;(3)在移动过程中盘子可以放在A,B,C的任意一个柱子上。

     总结:递归算法的执行过程是不断地自调用,直到到达递归出口才结束自调用过程;到达递归出口后,递归算法开始按最后调用的过程最先返回的次序返回;返回到最外层的调用语句时递归算法执行过程结束

    递归算法既是一种有效的算法设计方法,也是一种有效的分析问题的方法。递归算法求解问题的基本思想是:对于一个较为复杂的问题,把原问题分解成若干个相对简单且类同的子问题,这样,原问题就可递推得到解。

    适宜于用递归算法求解的问题的充分必要条件是:
    (1)问题具有某种可借用的类同自身的子问题描述的性质;
    (2)某一有限步的子问题(也称作本原问题)有直接的解存在。
    当一个问题存在上述两个基本要素时,该问题的递归算法的设计方法是:
    (1)把对原问题的求解设计成包含有对子问题求解的形式。
    (2)设计递归出口。

    3.递归问题的非递归表示

    一般说来,递归过程的实现效率是非常低的,每次递归调用都必须首先做诸如参数替换、环境保护等事情。造成效率低下的另一个重要的原因是大量的重复计算

    递归:容易堆栈溢出,并且大量的重复计算

    1)设计迭代算法:如果一个函数既有递归形式的定义又有非递归的迭代形式的定义,则可以用循环结构设计出迭代算法。一般说来,如果在一个函数或过程中只递归调用它一次,那么它的计算或执行过程可以看成是线性变化的。从顶到底的再从底返回的递归可以看作从底到顶的迭代。用空间换取时间,可以进行一些空间优化。

    2)尾递归

    3)模拟堆栈:人工模拟就可以控制栈的大小,这个栈中保存着一些可能会丢失的信息。或者是当你不知道下一步进行到哪儿了,进行栈中的操作

    4.递归方程解的渐近阶的求法

    一些递归算法的复杂度分析可以用递推公式求得

    把一个大问题分为a个子问题,子问题的规模是n/c,bn表示的是用子问题计算大问题的计算量

    5.生成函数

    我愿意称之为绝活!可以看出来这个玩意可以很好的求通项公式

     

     

  • 相关阅读:
    学习:Radio Button和Check Box
    学习:访问Edit Control的七种方法
    实现:EDIT控件字符个数与长度的计算
    学习:GDI基础
    学习:MFC的CWinApp和CFrameWnd
    学习:远程代码注入
    实现:获取指定进程PID
    学习:远程线程实现DLL注入和shellcode注入以及OD调试原理
    学习:内存映射文件
    实现 Trie (前缀树)
  • 原文地址:https://www.cnblogs.com/code-fun/p/12517694.html
Copyright © 2011-2022 走看看