热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在javascript中的尾递归

如何解决《在javascript中的尾递归》经验,为你挑选了2个好方法。

我在JS方面不是很有经验.但是,作为大多数人,我有时需要在浏览器中添加一些额外的功能.

在寻找其他问题的答案时,我在SO处找到了这个答案.答案和响应者都受到高度评价,按照SO标准,这意味着它们非常可靠.引起我注意的是,在"neatened up"变体中,它使用尾递归来循环函数:

(function myLoop (i) {          
   setTimeout(function () {   
      alert('hello');          //  your code here                
      if (--i) myLoop(i);      //  decrement i and call myLoop again if i > 0
   }, 3000)
})(10);     

从我的角度看,这看起来像糟糕的工程.使用递归来解决命令式/ OO语言中的非递归问题就是要求麻烦.十次或100次迭代应该是安全的.但是10000或无限循环呢?在像Erlang和Haskell这样的纯函数式语言中,我知道尾递归在编译期间被转换为循环,并且不会向堆栈添加额外的帧.据我所知,对于例如C/C++或Java的所有编译器而言,情况并非如此.

JS怎么样?在没有SO风险的情况下使用尾递归是否安全?或者这取决于脚本运行的实际解释器?



1> Aadit M Shah..:

您提供的示例没有任何尾递归.考虑:

(function loop(i) {
    setTimeout(function main() {
        alert("Hello World!");
        if (i > 1) loop(i - 1);
    }, 3000);
}(3));


2> georg..:

该代码本身不是递归的,恰恰相反,它使用延续传递来消除尾调用.这是一个没有的例子setTimeout:

// naive, direct recursion

function sum_naive(n) {
  return n == 0 ? 0 : n + sum_naive(n-1);
}

try {
  sum_naive(50000)
} catch(e) {
  document.write(e + "
") } // use CPS to optimize tail recursive calls function sum_smart(n) { function f(s, n) { return n == 0 ? s : function() { return f(s+n, n-1) }; } var p = f(0, n) while(typeof p == "function") p = p() return p; } document.write(sum_smart(50000) + "
")

推荐阅读
author-avatar
焦作艾文斯
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有