目录:
一:定义
递归指的是在函数的定义中使用函数自身的方法
在使用递归时,程序员需要注意定义一个从函数退出的条件,否则会进入死循环
二.通俗易懂的例子
从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……'"
三.语法格式
void recursion()
{
statements;
... ... ...
recursion(); /* 函数调用自身 */
... ... ...
}
int main()
{
recursion();
}
四.流程图
五:递归的弊端
递归是一个简洁的概念,同时也是一种很有用的手段
但是,使用递归是要付出代价的
与直接的语句(如while循环)相比,递归函数会耗费更多的运行时间,并且要占用大量的栈空间
递归函数每次调用自身时,都需要把它的状态存到栈中,以便在它调用完自身后,程序可以返回到它原来的状态
未经精心设计的递归函数总是会带来麻烦
六:什么条件下可以采用递归方法来解决问题
1、可以把要解决的问题转化为一个新问题
而这个新的问题的解决方法仍与原来的解决方法相同
只是所处理的对象有规律地递增或递减
解决问题的方法相同
调用函数的参数每次不同(有规律的递增或递减)
如果没有规律也就不能适用递归调用
2.可以应用这个转化过程使问题得到解决
使用其他的办法比较麻烦或很难解决
而使用递归的方法可以很好地解决问题
3.必定要有一个明确的结束递归的条件
一定要能够在适当的地方结束递归调用
不然可能导致系统崩溃
实例1【数的阶乘】
#include <stdio.h>
double factorial(unsigned int i)
{
if(i <= 1)
{
return 1;
}
return i * factorial(i - 1);
}
int main()
{
int i = 15;
printf("%d 的阶乘为 %f\n", i, factorial(i));
return 0;
}
运行结果:
15 的阶乘为 1307674368000.000000
实例2【斐波那契数列】
#include <stdio.h>
int fibonaci(int i)
{
if(i == 0)
{
return 0;
}
if(i == 1)
{
return 1;
}
return fibonaci(i-1) + fibonaci(i-2);
}
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("%d\t\n", fibonaci(i));
}
return 0;
}
运行结果:
0
1
1
2
3
5
8
13
21
34