递归原理解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014248127/article/details/79325313

大部分的人对递归的理解可能停留在递归编程:递归(recursion)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己。这篇文章会从递归编程出发一步步了解递归原理。

一、递归编程:递归(recursion)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。

1,采用递归方法的原因:

递归通常用来解决结构自相似的问题。所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小。实际上,递归是把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。

2,递归的两个基本要素:
边界条件:确定递归到何时终止,也称为递归出口。
递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果

二、递归原理:

1,递归函数的内部执行过程:
一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:

(1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;
(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;
(3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,
然后转向返回地址指定的位置继续执行。 

2,递归调用有层级关系:如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。

  • 每一级的函数调用都有它自己的变量。
  • 每一次函数调用都会有一次返回,并且是某一级递归返回到调用它的那一级,而不是直接返回到main()函数中的初始调用部分。
  • 递归函数中,位于递归调用前的语句和各级被调函数具有相同的执行顺序。位于递归调用语句之前,它按照递归调用的顺序被执行,即依次为第一级、第二级、第三级、第四级……。
  • 递归函数中,位于递归调用后的语句的执行顺序和各个被调函数的顺序相反。位于递归调用语句之后,其执行顺序依次是:….第四级、第三级、第二级、第一级。
  • 虽然每一级递归都有自己的变量,但是函数代码不会复制。
  • 递归函数中必须包含终止递归的语句。通常递归函数会使用一个if条件语句或其他类似语句一边当函数参数达到某个特定值时结束递归调用。

三、实例解释递归的原理:(python)

def ff(n):
    print('layer is {};address is :{}'.format(n,id(n)))
    if n < 4:
        ff(n+1)
    print('layer is {};address is :{}'.format(n, id(n)))
ff(1)
**输出:**
layer is 1;address is :1548465216
layer is 2;address is :1548465248
layer is 3;address is :1548465280
layer is 4;address is :1548465312

layer is 4;address is :1548465312
layer is 3;address is :1548465280
layer is 2;address is :1548465248
layer is 1;address is :1548465216

递归的具体工作过程:

输出一共八句,前四句很好理解,后四句的理解体现了递归的根本:当某一级递归结束,则该级函数马上将程序的控制权交给该函数的调用函数。 比如说第四级调用,输出了语句#1之后,判断n < 4时是不成立的,所以不再继续递归调用,而是输出语句#2,输完语句#2之后,第四级调用就结束了,此时它就会将控制权交给第三级调用,第三级调用函数中前一个执行过的语句是在if语句中进行第四级调用,因此,当第三级调用获得第四级给它的控制权时,它继续执行后面的代码,即执行打印语句#2,这就输出了第6句话。当第三级调用结束后,第二级调用函数开始继续执行,即输出了第7句话。以此类推。

猜你喜欢

转载自blog.csdn.net/u014248127/article/details/79325313