Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
478 views
in Technique[技术] by (71.8m points)

怎么比较形象的理解堆栈溢出的概念

关于堆栈溢出百度了一下,比较蒙蔽,这个东西比较抽象啊,有没有用一种比喻的方式来理解这个东西呢,哎呀是在不知道这是个什么玩意,递归调用会产生这个东西


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

递归问题

  • 斐波那契数列

  • 求一个数的阶乘

  • 一个人上台阶可以上一步也可以上两步,问他走10级台阶有多少种走法?

  • 汉诺塔

  • 乌龟寻路径
    。。。。。。

上诉问题都是递归调用的问题,以求阶乘为例

lizi

求数的阶乘

function factorial(n) {
  if (n === 1) return 1;
  return n * factorial(n - 1);
}

factorial(3) // 6
  • 最好手动的自己在纸上写一遍这个过程,体会一下调用时,堆栈递增的过程

  • 这个代码有啥问题呢,递归非常耗费内存,因为需要同时保存成千上百个调用记录,很容易发生"栈溢出"错误(stack overflow)

digui

  • 这样不求到最后一个值是不会释放上层的堆栈的。

  • 那么如何解决这个问题,目前有Tail Call Optimize尾调优化,求阶乘的代码改成

function factorial(n, total) {
  if (n === 1) return total;
  return factorial(n - 1, n * total);
}

factorial(5, 1) // 120
  • di

  • 这个尾递归就不会发生堆栈溢出的问题,你体会一下两者的区别

阅读

推荐一篇阮老师的文章,希望对你理解有帮助

图片都来自网络


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...