内容简介:但这样就会保持10条记录,这样很容易造成栈溢出;我们可以这样理解,执行一个函数A,添加一个记录A,在函数A中调用函数B,添加一个记录B,等函数B执行完了之后,移除记录B,把控制器交给A。因为递归就是函数里面调用函数,所以会有10条记录。这样就只保存一条记录,不会造成栈溢出。而这个为什么只有一条记录呢?这是因为函数fact_iter返回的是它本身,返回本身之后,它就不再需要控制器了(就是没它什么事了,它把任务交个了下家了),所以不会进栈,就不会有这条记录。
一 第一版一版的递归实现 n!,比如 5!= 5 * 4 * 3 * 2 *1
let count = 9000;
const fact = (n) => {
if (n == 1) {
return 1;
} else {
return n * fact(n - 1);
}
};
let a = fact(count); //3628800;
console.log(a);
但这样就会保持10条记录,这样很容易造成栈溢出;我们可以这样理解,执行一个函数A,添加一个记录A,在函数A中调用函数B,添加一个记录B,等函数B执行完了之后,移除记录B,把控制器交给A。因为递归就是函数里面调用函数,所以会有10条记录。
二、尾递归
const newFact = (n) => {
return fact_iter(n, 1);
};
const fact_iter = (num, product) => {
if (num == 1) {
return product;
} else {
return fact_iter(num - 1, num * product);
}
};
const b = newFact(count); //3628800;
console.log(b);
这样就只保存一条记录,不会造成栈溢出。而这个为什么只有一条记录呢?这是因为函数fact_iter返回的是它本身,返回本身之后,它就不再需要控制器了(就是没它什么事了,它把任务交个了下家了),所以不会进栈,就不会有这条记录。
以上所述就是小编给大家介绍的《js实现递归,尾递归(递归优化),防止栈溢出》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
社交的本质:扎克伯格的商业秘密
兰迪•扎克伯格 / 谢天 / 中信出版集团股份有限公司 / 2016-6-1 / CNY 45.00
从发表个人观点到找工作,从交朋友到找伴侣,社会化媒体的广泛应用、互联技术的高速发展已经改变了我们生活的各个领域。 Facebook早期成员之一,兰迪·扎克伯格阐述了社交的本质,并首次披露Facebook的商业策略。她以社交媒体实践者的视角,分享了自己在Facebook负责营销的从业经历与成长故事,以及对互联网和社会未来变化趋势的思考,并给组织和个人提出了解决方案。一起来看看 《社交的本质:扎克伯格的商业秘密》 这本书的介绍吧!
MD5 加密
MD5 加密工具
RGB CMYK 转换工具
RGB CMYK 互转工具