JavaScript中的函数递归方法?糟糕的做法?

时间:2014-01-20 00:08:14

标签: javascript recursion functional-programming

任何人都可以看到这样编写的递归函数存在问题:

var recurse = 100;
var recursed = 0;

(function (callback){

  callback(callback);

})(function(callback){

  recursed++;

  console.log('recursed ' + recursed + ' times');

  if(recursed < recurse){

    callback(callback);

  }
});

为什么这可能会执行得更慢?或者可能被认为是不好的做法?

这个函数式编程是不是已经破坏了?

2 个答案:

答案 0 :(得分:3)

函数式编程的核心原则是数据不变性,函数是数学意义上的函数(即取值和返回值而没有任何副作用)。这些原则形成参照透明度,即给定相同的参数,函数将始终返回相同的结果。

您的功能不满足任何被称为“功能”的标准。

以下是如何以函数样式完成递归的示例:

var recursiveFunction = function( count, max ) {
  if( count < max ){
    return recursiveFunction( count + 1, max )
  } else {
    return count
  }
}

var result = recursiveFunction(0, 100) // result == 99

答案 1 :(得分:2)

  

为什么这可能会执行得更慢?

是。 JavaScript几乎没有尾调用优化。循环会更快。

  

或者可能被认为是不好的做法?

是。您的示例代码无法读取,很难掌握所有这些callback的功能。

如果你想对这样的事情使用递归,那么IENFE(Named&amp; Immediately Executed Function Expression)将是更好的选择:

(function callback(recursed) {
     console.log('recursed ' + recursed + ' times');
     if (recursed < 100)
         callback(recursed + 1);
})(0);