递归详解
2013-11-18 09:56
405 查看
最近遇到递归问题,感觉能写出程序,但是总不那么自信,于是决定在整一整递归。
递归问题的实质是 利用系统提供的递归栈来保存变量值,然后一直递归直到到达递归终止条件时,然后一层递归栈一层递归栈开始返回,在返回的过程中递归栈中保存的变量开始被使用,直到返回到最后一层递归栈。
例子: 还是n的阶乘。 如函数 int digui(int n ); 比如 n = 3
递归栈如下
-----------------------
n=3 | 3*digui(2) 会退到这里, 此时digui(2)的返回值是2, 3*digui(2) = 6. 这里返回到最后一层递归栈了, 最后函数运行到最后一条语句结束。
_____________
_____________
n=2 | 2*digui(1) 回退到这里, 此时digui(1) 的返回值是1, 2 * 1 = 2 , 即该递归栈返回的值为2
-----------------------
-----------------------
n=1 | return 1 至此到达递归终止条件, 返回1
----------------------
可能,讲的不是很清楚。 如果想要好好弄懂递归, 建议就是自己画递归栈的图, 注意图中标注, 传入的参数, 和返回的变量值, 然后一层一层回退, 多弄几次, 就会明白。
递归栈图示:
---------------------------------------------------------------------------------------------------
arg1=val1 | arg2=val2 | arg3=val3 |.......| returnval1 = | returnval2 = | .....|
---------------------------------------------------------------------------------------------------
递归问题的实质是 利用系统提供的递归栈来保存变量值,然后一直递归直到到达递归终止条件时,然后一层递归栈一层递归栈开始返回,在返回的过程中递归栈中保存的变量开始被使用,直到返回到最后一层递归栈。
例子: 还是n的阶乘。 如函数 int digui(int n ); 比如 n = 3
递归栈如下
-----------------------
n=3 | 3*digui(2) 会退到这里, 此时digui(2)的返回值是2, 3*digui(2) = 6. 这里返回到最后一层递归栈了, 最后函数运行到最后一条语句结束。
_____________
_____________
n=2 | 2*digui(1) 回退到这里, 此时digui(1) 的返回值是1, 2 * 1 = 2 , 即该递归栈返回的值为2
-----------------------
-----------------------
n=1 | return 1 至此到达递归终止条件, 返回1
----------------------
可能,讲的不是很清楚。 如果想要好好弄懂递归, 建议就是自己画递归栈的图, 注意图中标注, 传入的参数, 和返回的变量值, 然后一层一层回退, 多弄几次, 就会明白。
递归栈图示:
---------------------------------------------------------------------------------------------------
arg1=val1 | arg2=val2 | arg3=val3 |.......| returnval1 = | returnval2 = | .....|
---------------------------------------------------------------------------------------------------
相关文章推荐
- oracle for update和for update nowait
- js事件不生效的原因
- rhel6配置本地yum源
- ccmenu里的位置
- xcode 高亮
- IPC机制--Binder
- Android 软键盘imeOptions(Done)的用法
- C++ C语言与C++区别
- 设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
- asp.net 验证码 【Drawing.BitMap】
- 视频: 千重浪Linux系统调试技术培训 03-01-Basic-CPU-Address
- 未命名 3
- OpenCV_Mat 转 IplImage*类型
- 联合体(共用体)union
- js iframe问题
- VC 下 由进程名获取进程句柄
- 免费软件推荐:免费的局域网聊天工具!
- 未命名 3
- SVN的标准目录结构:trunk、branches、tags
- 程序员经验