首页 Javascript 正文
519

Javascript尾递归的应用实例

  • yiqingpeng
  • 2015-07-08
  • 0
  •  
实例一、创建具有唯一Id的Dom元素
+function(){
  function getUniqueEleId(){
      var uid='uid'+parseInt(Math.random()*10000);
      if(document.getElementById(uid)){
          //遇到相同ID的元素就重新执行函数自身(尾递归)。
          return arguments.callee();//或者return getUniqueEleId();
      }else{
          return uid;
      }
  }
  var uid = getUniqueEleId();
  var div = document.createElement('div');
  div.id = div.innerHTML = uid;
  div.onclick = function(){
        console.log(this.id);
  };
  document.body.appendChild(div);
}();
实例二、计算自然数n~m之和
function S(n, m){
   if(m==n) return n;
   else return m + arguments.callee(n, m-1);
}
console.log(S(2,6));//2+3+4+5+6=20
尾递归有时候很方便,但是也会带来性能上的问题。如果调用方式是线性的,那么性能上可能问题不大;如果调用方式是指数增长的,就要避免使用了,比如下面求斐波那契数列的例子:
function fibonacci(n) {  
    return (function(n) {  
        if (n == 1 || n == 2)  
            return 1; 
        return arguments.callee(n - 1) + arguments.callee(n - 2); //同时调用自身两次,数量级呈指数增长。
    })(n); 
}

正在加载评论...