c语言
![](/icons/6267hanshu.gif)
可以自我
![](/icons/6267diaoyong.gif)
![](/icons/6267dou2.gif)
如果
![](/icons/6267hanshu.gif)
内部
![](/icons/6267yi.gif)
个语句
![](/icons/6267diaoyong.gif)
了
![](/icons/6267hanshu.gif)
自己
![](/icons/6267dou.gif)
则称这个
![](/icons/6267hanshu.gif)
是“递归”
![](/icons/6267dou2.gif)
递归是以自身定义
![](/icons/6267de.gif)
过程
![](/icons/6267dou2.gif)
也可称为“循环定义”
![](/icons/6267dou2.gif)
递归
![](/icons/6267de.gif)
例子很多
![](/icons/6267dou2.gif)
例如定义整数
![](/icons/6267de.gif)
递归思路方法是用数字1
![](/icons/6267dou.gif)
2
![](/icons/6267dou.gif)
3
![](/icons/6267dou.gif)
4
![](/icons/6267dou.gif)
5
![](/icons/6267dou.gif)
6
![](/icons/6267dou.gif)
7
![](/icons/6267dou.gif)
8
![](/icons/6267dou.gif)
9加上或减去
![](/icons/6267yi.gif)
个整数
![](/icons/6267dou2.gif)
例如
![](/icons/6267dou.gif)
数字15是7+8;数字21是9+12;数字12是9+3
![](/icons/6267dou2.gif)
![](/icons/6267yi.gif)
种可递归
![](/icons/6267de.gif)
计算机语言
![](/icons/6267dou.gif)
它
![](/icons/6267de.gif)
![](/icons/6267hanshu.gif)
能够自己
![](/icons/6267diaoyong.gif)
自己
![](/icons/6267dou2.gif)
![](/icons/6267yi.gif)
个简单
![](/icons/6267de.gif)
例子就是计算整数阶乘
![](/icons/6267de.gif)
![](/icons/6267hanshu.gif)
factor
![](/icons/6267kh.gif)
数n
![](/icons/6267de.gif)
阶乘是1到n的间所有数字
![](/icons/6267de.gif)
乘积
![](/icons/6267dou2.gif)
例如3
![](/icons/6267de.gif)
阶乘是1×2×3
![](/icons/6267dou.gif)
即是6
![](/icons/6267dou2.gif)
factor
![](/icons/6267kh.gif)
和其等效
![](/icons/6267hanshu.gif)
fact
![](/icons/6267kh.gif)
如例4-10所示
![](/icons/6267dou2.gif)
![](\"/UpLoadFiles/UploadFiles_4622/200612/2006121103952404.g<img)
\" width=335 _disibledevent=>500)this.style.width=500;\" _disibledevent=>
非递归
![](/icons/6267hanshu.gif)
fact
![](/icons/6267kh.gif)
![](/icons/6267de.gif)
执行应该是易于理解
![](/icons/6267de.gif)
![](/icons/6267dou2.gif)
它应用
![](/icons/6267yi.gif)
个从1开始到指定数值结束
![](/icons/6267de.gif)
循环
![](/icons/6267dou2.gif)
在循环中
![](/icons/6267dou.gif)
用“变化”
![](/icons/6267de.gif)
乘积依次去乘每个数
![](/icons/6267dou2.gif)
factor
![](/icons/6267kh.gif)
![](/icons/6267de.gif)
递归执行比fact
![](/icons/6267kh.gif)
稍复杂
![](/icons/6267dou2.gif)
当用参数1
![](/icons/6267diaoyong.gif)
factor
![](/icons/6267kh.gif)
时
![](/icons/6267dou.gif)
![](/icons/6267hanshu.gif)
返回1;除此的外
![](/icons/6267de.gif)
其它值
![](/icons/6267diaoyong.gif)
将返回factor(n-1)*n这个乘积
![](/icons/6267dou2.gif)
为了求出这个表达式
![](/icons/6267de.gif)
值
![](/icons/6267dou.gif)
用(n-1)
![](/icons/6267diaoyong.gif)
factor
![](/icons/6267kh.gif)
![](/icons/6267yi.gif)
直到n等于1
![](/icons/6267dou.gif)
![](/icons/6267diaoyong.gif)
开始返回
![](/icons/6267dou2.gif)
计算2
![](/icons/6267de.gif)
阶乘时对factor
![](/icons/6267kh.gif)
![](/icons/6267de.gif)
首次
![](/icons/6267diaoyong.gif)
引起了以参数1对factor
![](/icons/6267kh.gif)
![](/icons/6267de.gif)
第 2次
![](/icons/6267diaoyong.gif)
![](/icons/6267dou2.gif)
这次
![](/icons/6267diaoyong.gif)
返回1
![](/icons/6267dou.gif)
然后被2乘(n
![](/icons/6267de.gif)
![](/icons/6267chushi.gif)
值)
![](/icons/6267dou.gif)
答案是2(把pr
![](/icons/6267int.gif)
f
![](/icons/6267kh.gif)
语句插入到factor
![](/icons/6267kh.gif)
中
![](/icons/6267dou.gif)
察看各级
![](/icons/6267diaoyong.gif)
及其中间答案
![](/icons/6267dou.gif)
是很有趣
![](/icons/6267de.gif)
)
![](/icons/6267dou2.gif)
当
![](/icons/6267hanshu.gif)
![](/icons/6267diaoyong.gif)
自己时
![](/icons/6267dou.gif)
在栈中为新
![](/icons/6267de.gif)
局部变量和参数分配内存
![](/icons/6267dou.gif)
![](/icons/6267hanshu.gif)
![](/icons/6267de.gif)
代码用这些变量和参数重新运行
![](/icons/6267dou2.gif)
递归
![](/icons/6267diaoyong.gif)
并不是把
![](/icons/6267hanshu.gif)
代码重新复制
![](/icons/6267yi.gif)
遍
![](/icons/6267dou.gif)
仅仅参数是新
![](/icons/6267de.gif)
![](/icons/6267dou2.gif)
当每次递归
![](/icons/6267diaoyong.gif)
返回时
![](/icons/6267dou.gif)
老
![](/icons/6267de.gif)
局部变量和参数就从栈中消除
![](/icons/6267dou.gif)
从
![](/icons/6267hanshu.gif)
内此次
![](/icons/6267hanshu.gif)
![](/icons/6267diaoyong.gif)
点重新启动运行
![](/icons/6267dou2.gif)
可递归
![](/icons/6267de.gif)
![](/icons/6267hanshu.gif)
被说成是对自身
![](/icons/6267de.gif)
“推入和拉出”
![](/icons/6267dou2.gif)
大部分递归例程没有明显地减少代码规模和节省内存空间
![](/icons/6267dou2.gif)
另外
![](/icons/6267dou.gif)
大部分例程
![](/icons/6267de.gif)
递归形式比非递归形式运行速度要慢
![](/icons/6267yi.gif)
些
![](/icons/6267dou2.gif)
这是
![](/icons/6267yinwei.gif)
附加
![](/icons/6267de.gif)
![](/icons/6267hanshu.gif)
![](/icons/6267diaoyong.gif)
增加了时间开销(在许多情况下
![](/icons/6267dou.gif)
速度
![](/icons/6267de.gif)
差别不太明显)
![](/icons/6267dou2.gif)
对
![](/icons/6267hanshu.gif)
![](/icons/6267de.gif)
多次递归
![](/icons/6267diaoyong.gif)
可能造成堆栈
![](/icons/6267de.gif)
溢出
![](/icons/6267dou2.gif)
不过溢出
![](/icons/6267de.gif)
可能性不大
![](/icons/6267dou.gif)
![](/icons/6267yinwei.gif)
![](/icons/6267hanshu.gif)
![](/icons/6267de.gif)
参数和局部变量是存放在堆栈中
![](/icons/6267de.gif)
![](/icons/6267dou2.gif)
每次新
![](/icons/6267de.gif)
![](/icons/6267diaoyong.gif)
就会产生
![](/icons/6267yi.gif)
些变量
![](/icons/6267de.gif)
复制品
![](/icons/6267dou2.gif)
这个堆栈冲掉其它数据和
![](/icons/6267chengxu.gif)
![](/icons/6267de.gif)
存储区域
![](/icons/6267de.gif)
可能性是存在
![](/icons/6267de.gif)
![](/icons/6267dou2.gif)
但是除非递归
![](/icons/6267chengxu.gif)
运行失控
![](/icons/6267dou.gif)
否则不必为上述情况担心
![](/icons/6267dou2.gif)
递归
![](/icons/6267hanshu.gif)
![](/icons/6267de.gif)
主要优点是可以把算法写
![](/icons/6267de.gif)
比使用非递归
![](/icons/6267hanshu.gif)
时更清晰更简洁
![](/icons/6267dou.gif)
而且某些问题
![](/icons/6267dou.gif)
特别是和人工智能有关
![](/icons/6267de.gif)
问题
![](/icons/6267dou.gif)
更适宜用递归思路方法
![](/icons/6267dou2.gif)
递归
![](/icons/6267de.gif)
另
![](/icons/6267yi.gif)
个优点是
![](/icons/6267dou.gif)
递归
![](/icons/6267hanshu.gif)
不会受到怀疑
![](/icons/6267dou.gif)
较非递归
![](/icons/6267hanshu.gif)
而言
![](/icons/6267dou.gif)
某些人更相信递归
![](/icons/6267hanshu.gif)
![](/icons/6267dou2.gif)
编写递归
![](/icons/6267hanshu.gif)
时
![](/icons/6267dou.gif)
必须在
![](/icons/6267hanshu.gif)
![](/icons/6267de.gif)
某些地方使用
![](/icons/6267if.gif)
语句
![](/icons/6267dou.gif)
强迫
![](/icons/6267hanshu.gif)
在未执行递归
![](/icons/6267diaoyong.gif)
前返回
![](/icons/6267dou2.gif)
如果不这样做
![](/icons/6267dou.gif)
在
![](/icons/6267diaoyong.gif)
![](/icons/6267hanshu.gif)
后
![](/icons/6267dou.gif)
它永远不会返回
![](/icons/6267dou2.gif)
在递归
![](/icons/6267hanshu.gif)
中不使用
![](/icons/6267if.gif)
语句
![](/icons/6267dou.gif)
是
![](/icons/6267yi.gif)
个很常见
![](/icons/6267de.gif)
![](/icons/6267cuowu.gif)
![](/icons/6267dou2.gif)
在开发过程中广泛使用pr
![](/icons/6267int.gif)
f
![](/icons/6267kh.gif)
和getchar
![](/icons/6267kh.gif)
可以看到执行过程
![](/icons/6267dou.gif)
并且可以在发现
![](/icons/6267cuowu.gif)
后停止运行