- 7
- 0
- 约1.41千字
- 约 2页
- 2017-06-08 发布于重庆
- 举报
一步一步写算法(之递归和堆栈)
一步一步写算法(之递归和堆栈)
看过我前面博客的朋友都清楚,函数调用主要依靠ebp和esp的堆栈互动来实现的。那么递归呢,最主要的特色就是函数自己调用自己。如果一个函数调用的是自己本身,那么这个函数就是递归函数。 我们可以看一下普通函数的调用怎么样的。试想如果函数A调用了函数B,函数B又调用了函数C,那么在堆栈中的数据是怎么保存的呢?
[cpp] view plaincopy
函数A ^
函数B | 地址递减 函数C | 如果是递归函数呢,举一个简单的递归函数为例:[cpp] view plaincopy
int iterate int value if value 1 return 1; return value + iterate value -1 ; 下面我们使用一个函数进行调用,看看会发生什么情况?[cpp] view plaincopy
void process int value iterate 6 ; 看看此时内存堆栈是什么样的?[cpp] view plaincopy
iterate int 1 line 96
iterate int 2 line 97 + 12 bytes
iterate int 3 line 97 + 12 bytes
iterate int 4 line 97 + 12 bytes
iterate int 5 line 97 + 12 bytes
iterate int 6 line 97 + 12 bytes
process line 102 + 7 bytes
main line 108
mainCRTStartup line 206 + 25 bytes
KERNEL32! 7c817067 大家也看到了上面的代码,递归函数和普通的函数也没有什么差别。除了自己调用本身之外,他就是一个普通的函数。那么这个函数递归到什么时候返回呢?这就是递归函数的关键了。我们看到iterate函数到1就停止了,所以上面的堆栈在(value 1)即return。所以一个递归函数最关键的部分就是两点:(1)递归策略;(2)函数出口。 看到这里,大家可能感到递归函数不过如此,事实上也是这样。但是,还有一点大家需要牢记在心,递归的深度是我们必须考虑的一个问题。只有递归深度在一个可控的范围内,那么整个递归过程都是可控的。那什么时候不可控呢?那就是递归深度超过了一定的数字?这个数字和具体的线程堆栈长度有关?等到堆栈溢出了,那么获得的数据已经失去了真实性,所以也就没有意义了。 我们把上面的问题推广一下,如何用自己定义的堆栈模拟上面的递归调用呢?这样既能满足递归的属性,又能确保函数深度可控。 大家可以先写一下自己的方案,下面只是我个人的一个思路。
[cpp] view plaincopy
int iterate int value int count 0; int number 0; push value ; while -1 ! number pop if 1 ! number push number -1 ; count + number; return count; 软件英才网 软件行业驰名招聘网站 有需要请联系我们
您可能关注的文档
- 一次性用品的坏处【作文】.doc
- 一次性精密输液器.doc
- 一次性打火机用完不要摔.docx
- 一次性打火机用完千万别扔.docx
- 一次性纸杯新国标实施太原市场在售产品基本不合格.doc
- 一次成型倒角刀具中文介绍.doc
- 马哲演讲稿~~关于生活的思考.doc
- 一次线二次线工艺规程.doc
- 验船师考试培训复习题解答(方开骏2010年9月).doc
- 一次设备运行问答题.doc
- 2025-2026学年天津市和平区高三(上)期末数学试卷(含解析).pdf
- 2025-2026学年云南省楚雄州高三(上)期末数学试卷(含答案).pdf
- 2025-2026学年甘肃省天水市张家川实验中学高三(上)期末数学试卷(含答案).docx
- 2025-2026学年福建省厦门市松柏中学高二(上)期末数学试卷(含答案).docx
- 2025-2026学年广西钦州市高一(上)期末物理试卷(含答案).docx
- 2025-2026学年河北省邯郸市临漳县九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省石家庄二十三中七年级(上)期末历史试卷(含答案).docx
- 2025-2026学年海南省五指山市九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省唐山市玉田县九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省邢台市市区九年级(上)期末化学试卷(含答案).docx
原创力文档

文档评论(0)