美文网首页前端开发笔记让前端飞
通过尾递归避免栈溢出

通过尾递归避免栈溢出

作者: 后除 | 来源:发表于2018-02-12 17:13 被阅读31次

JavaScript中的递归即函数内调用函数自身,但递归是非常耗内存的,每一次调用都会分配一定的栈空间,达到一定的数量(具体看浏览器)便会溢出报错。

function recursion (num) {
    if (num === 1) {
        return 1;
    }
    return num + recursion(--num);
}
console.log(recursion(5)); // 15
console.log(recursion(1000)); // 500500
console.log(recursion(10000000)); // Uncaught RangeError: Maximum call stack size exceeded

对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。

'use strict';
function recursion (num, total = 0) {
    if (num === 1) {
        return total + 1;
    }
    return recursion(num - 1, total + num);
}
console.log(recursion(5)); // 15
console.log(recursion(1000)); // 500500
console.log(recursion(10000000)); // Uncaught RangeError: Maximum call stack size exceeded

实际上还是报错了:D。

相关文章

  • 通过尾递归避免栈溢出

    JavaScript中的递归即函数内调用函数自身,但递归是非常耗内存的,每一次调用都会分配一定的栈空间,达到一定的...

  • 9. 递归函数

    使用递归函数需要注意防止栈溢出解决递归调用栈溢出的方法是通过尾递归优化遗憾的是,大多数编程语言没有针对尾递归做优化...

  • python学习

    1:尾递归 解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊...

  • 递归&尾递归

    调用栈的特点,先进后出, FILO, 场景还原。 递归 有栈溢出的可能 stack overflow 尾递归 编译...

  • 1

    #函数 ##递归函数容易,栈溢出,这个时候可以用*尾递归*优化,尾递归的意思就是说在递归函数末尾引用本函数的时候,...

  • JavaScript计算斐波那契数列

    很多语言都提供可尾递归优化,能将尾递归替换为循环方式调用,可以提高计算速度并避免堆栈溢出。但是javascript...

  • Python学习之路(递归函数)

    函数之 递归函数 小结 使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。针对尾递归优化的语言可以通...

  • python学习4

    学廖雪峰老师的python教程笔记。 1、递归函数 函数内部调用该函数本身,比循环逻辑简单 注意防止栈溢出 尾递归...

  • JVM_JMM: StackOverFlow栈溢出

    使用递归演示,自己调用自己导致栈空间溢出,递归和回溯。源代码:MyTest3.java 通过设置VMOption:...

  • 虚拟机栈溢出

    错误原因:java.lang.StackOverflowError 栈内存溢出 栈溢出产生递归调用,循环遍历是不会...

网友评论

本文标题:通过尾递归避免栈溢出

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