美文网首页
C++算法之递归和堆栈的代码

C++算法之递归和堆栈的代码

作者: jiangmm | 来源:发表于2019-04-29 15:53 被阅读0次

开发过程中,把开发过程较好的代码段收藏起来,如下资料是关于C++算法之递归和堆栈的代码,希望对码农们有些用。

函数A    ^ 

函数B    |    (地址递减) 

函数C    | 

如果是递归函数呢,举一个简单的递归函数为例:

int iterate(int value) 

    if(value == 1) 

        return 1; 

    return value + iterate(value -1); 

下面我们使用一个函数进行调用,看看会发生什么情况?

void process() 

    int value = iterate(6); 

看看此时内存堆栈是什么样的?

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)函数出口。看到这里,大家可能感到递归函数不过如此,事实上也是这样。但是,还有一点大家需要牢记在心,递归的深度是我们必须考虑的一个问题。只有递归深度在一个可控的范围内,那么整个递归过程都是可控的。那什么时候不可控呢?那就是递归深度超过了一定的数字?这个数字和具体的线程堆栈长度有关?等到堆栈溢出了,那么获得的数据已经失去了真实性,所以也就没有意义了。我们把上面的问题推广一下,如何用自己定义的堆栈模拟上面的递归调用呢?这样既能满足递归的属性,又能确保函数深度可控。大家可以先写一下自己的方案,下面只是我个人的一个思路。

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; 

相关文章

  • C++算法之递归和堆栈的代码

    开发过程中,把开发过程较好的代码段收藏起来,如下资料是关于C++算法之递归和堆栈的代码,希望对码农们有些用。 函数...

  • LeetCode 第 10 题:正则表达式匹配

    方法一:递归,减而治之 Java 代码: Python 代码: C++ 代码:

  • C++算法之线性堆栈的代码

    将内容过程经常用的内容片段记录起来,下边内容内容是关于C++算法之线性堆栈的内容。 typedef struct ...

  • 递归

    文章结构 递归是什么 递归需要满足的三个条件 如何编写递归代码 递归代码要警惕堆栈溢出 递归代码要警惕重复计算 怎...

  • sm2 国密算法 中 常数 乘以 点坐标 函数 详解

    完整代码参考链接:密码学算法之 SM2国密算法 部分代码: 递归函数详解:(这里显示了一个通常的递归函数过程伪代码...

  • 幂次方算法pow

    自定义的递归算法,代码要求的时间与空间复杂度较高,不适合嵌入式设备进行快速计算。代码由C++实现。 迭代算法,复杂...

  • 算法一看就懂之「 排序算法 」

    之前的文章咱们已经聊过了 「 数组和链表 」 「 堆栈 」 「 队列 」 「 递归 」 下图是常用排序算法的时间空...

  • 常见的死法

    溢出(含段错误): 堆栈的大小为8192KB,在c/c++程序的函数中申请了过大的空间,或者递归层次太多,导致堆栈...

  • Count and Say

    标签: C++ 算法 LeetCode 字符串 递归 每日算法——leetcode系列 问题 Count and...

  • A*寻路

    当然寻路算法不止 A* 这一种, 还有递归, 非递归, 广度优先, 深度优先, 使用堆栈等等, 有兴趣的可以研究研...

网友评论

      本文标题:C++算法之递归和堆栈的代码

      本文链接:https://www.haomeiwen.com/subject/rloynqtx.html