递归算法

来源:互联网 发布:大数据建设开展情况 编辑:程序博客网 时间:2024/06/06 00:10

递归函数就是直接或间接的调用自身的函数。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

注意:
  (1) 递归就是在过程或函数里调用自身;
  (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口

许多书里都用计算阶乘菲波那切数列来说明递归,然而这样并不是很好。在计算阶乘里,并没有看到递归有任何的优越之处。在菲波那切数列中,效率是非常低的。

  下面用一个简单的程序来说明递归。例如:给出一个值4267,我们需要一次产生字符‘4’、‘2’、‘6’、‘7’。采用的方法是将这个数反复除以10,并打印各个余数,余数加上字符‘0’就可以表示对应字符的代码。该种方法打印出来的数字是逆序的,因此我们需要通过递归来解决这个问题。

程序如下:

#include<stdio.h>void binary_to_ascii(unsigned int value){unsigned int qutient;    qutient = value/10;if(qutient !=0)binary_to_ascii(qutient);printf("%c\n",value % 10+'0');}int main(){unsigned int value = 4267;binary_to_ascii(value);return 0;}
结果输出来为字符‘4’、‘2’、‘6’、‘7’。


递归的工作原理:

追踪一个递归函数执行过程的关键是理解函数中所声明的变量是如何存储的。当函数被调用时,它的变量的空间是创建于运行时的

堆栈上。以前调用的函数的变量仍旧保留在堆栈上,但他们被新的变量所掩盖,因此不能被访问。下图显示了堆栈的状态。


不断通过递归调用执行除法后的堆栈内容如上图,递归调用过程中会在堆栈上保存变量值,当前quotient的值为0时,递归函数不再调用本身,而是开始打印输出。然后函数返回开始从上至下依次销毁堆栈上的变量值。每次调用printf得到变量value的最后一个数字,对value进行模十取余的运算,再加上字符‘0’,将字符依次打印出来。

注意:

   递归比非递归的形式更加清晰,但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性可能稍微差一些。当一个问题相当复杂,难以用迭代形式实现时,此时递归实现的间简洁性便可补偿它所带来的运行开销。



1 0