javascript中递归函数

来源:互联网 发布:python 冒泡排序 编辑:程序博客网 时间:2024/05/19 02:29

由于javascript的函数式编程特性,很多在其他其他语言中合法的操作在js中会产生错误,例如运行如下代码

function Fibonacci(n){  if(n <= 1)    return n;  return Fibonacci(n-1) + Fibonacci(n-2);}for(var i = 0;i < 10;i++)  console.log(i+":"+Fibonacci(i));var FibonacciCopy = Fibonacci;Fibonacci = null;for(i = 0;i < 10;i++){  console.log(i+":"+FibonacciCopy(i));}

运行结果

0:01:12:13:24:35:56:87:138:219:340:01:1/usr/local/JavaScript/Fib.js:4        return Fibonacci(n-1) + Fibonacci(n-2);               ^TypeError: Fibonacci is not a function    at Fibonacci (/usr/local/JavaScript/Fib.js:4:9)    at Object.<anonymous> (/usr/local/JavaScript/Fib.js:12:20)    at Module._compile (module.js:570:32)    at Object.Module._extensions..js (module.js:579:10)    at Module.load (module.js:487:32)    at tryModuleLoad (module.js:446:12)    at Function.Module._load (module.js:438:3)    at Module.runMain (module.js:604:10)    at run (bootstrap_node.js:383:7)    at startup (bootstrap_node.js:149:9)

在将斐波那契函数赋给另一个变量之后并将自身赋为null后,递归失败
有两种方法解决这个问题,第一种方式是借助arguments.callee,arguments.callee是一个指向当前正在运行的函数的指针

function Fibonacci(n){  if(n <= 1)    return n;  return arguments.callee(n-1) + arguments.callee(n-2);}for(var i = 0;i < 10;i++)  console.log(i+":"+Fibonacci(i));var FibonacciCopy = Fibonacci;Fibonacci = null;for(i = 0;i < 10;i++){  console.log(i+":"+FibonacciCopy(i));

arguments.callee进行递归之后,函数正常递归,但在严格模式下无法访问arguments.callee
第二种方法是命名函数表达式

var Fibonacci = (function f(n){  if(n <= 1)    return n;  return f(n-1) + f(n-2);})for(var i = 0;i < 10;i++)  console.log(i+":"+Fibonacci(i));var FibonacciCopy = Fibonacci;Fibonacci = null;for(i = 0;i < 10;i++){  console.log(i+":"+FibonacciCopy(i));
0:01:12:13:24:35:56:87:138:219:340:01:12:13:24:35:56:87:138:219:34

同样运行正常

原创粉丝点击