为了理解递归,则必须首先理解递归。
所谓递归,就是函数调用自身的一种方法。
要理解递归,首先要引入栈的概念。栈是一种数据结构。
简单的说,栈是存储数据的数据块,允许数据先进先出,类似于枪的弹匣。
栈用来存放递归过程中产生的中间数据。如果有判断条件,直到栈中的数据全部出栈递归完成;否则栈的空间会一直增加,递归也会一直进行。
为了避免这种现象,有时候我们要的结果是递归完后的结果,我们引入尾递归。
所谓的尾递归,是递归的一种特例。
是指把把递归的结果当成递归的参数,传给下一个递归。
这样一来之前的栈中的参数就没效果了,所以如果编译器对此进行优化的话,按照道理尾递归就永远不可能溢出。
下面来看下例子:
打印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);//利用尾递归就不用用异常法退出递归了。
}