递归、尾递归

为了理解递归,则必须首先理解递归。

所谓递归,就是函数调用自身的一种方法。

要理解递归,首先要引入栈的概念。栈是一种数据结构。

简单的说,栈是存储数据的数据块,允许数据先进先出,类似于枪的弹匣。

栈用来存放递归过程中产生的中间数据。如果有判断条件,直到栈中的数据全部出栈递归完成;否则栈的空间会一直增加,递归也会一直进行。

为了避免这种现象,有时候我们要的结果是递归完后的结果,我们引入尾递归。

所谓的尾递归,是递归的一种特例。

是指把把递归的结果当成递归的参数,传给下一个递归。

这样一来之前的栈中的参数就没效果了,所以如果编译器对此进行优化的话,按照道理尾递归就永远不可能溢出。

下面来看下例子:

打印1-1000这1000个数, 不许使用循环语句/条件语句,不许使用?:运算符。

//1,递归

int print(int i)

{

printf("%d\n",i++);

assert(i-1001);//或者用任何一种异常退出程序,比如除法 int t=1/(i-1000)

print(i);

}

//2,尾递归

int print(int i)

{

return (1000-i++)&&print(i);//利用尾递归就不用用异常法退出递归了。

}

 

posted @ 2012-12-24 16:20  da  阅读(323)  评论(0编辑  收藏  举报