2015-04-22 47 views
0

我有这个简单的阶乘函数。它适用于递归。但我最终得到的数字是NaN。我期待输出为6,阶乘为3.问题是因为我将x定义为全局变量?如果是的话,你如何定义一个变量作为局部函数内的函数,而不会使其在递归中发生变化。递归factiorial。我为什么得到NaN

var x; 
function factorial(num) 
{ 

    if (num > 0) { 
     x = num * factorial(num - 1); 
    } 
    return x; 
} 


console.log(factorial(3)); 
+0

'变种X;' - 初始化? – thefourtheye

+1

当您实现递归算法时,最好在参数中维护状态,而不是依赖于自由变量。目前你的实现不能计算两倍的因子。 – zerkms

+0

有没有办法在函数内初始化它,但每次函数运行时都没有初始化,因为这是递归@thefourtheye – Mozein

回答

4

如果num > 0,你定义x。什么是xnum不是> 0

建议:应该是1。不是。 :)

HINT2:尝试console.log(1 * undefined)

P.S:是的,var x应该去里面的功能。不,在这种情况下它没有做任何坏事,但它可以。

+1

”* ......它没有做任何坏事...... *“,呃,它没有。 ;-) – RobG

+0

@RobG:不,它没有。它被分配(或不),然后立即返回。如果你只是在函数内部粘贴'x = 1',它不依赖于前一个值。 (如果你不这样做,代码无论如何都不起作用,而不是变量的错误是全局的。) – Amadan

+1

我实际上最终没有定义任何新的变量。只是返回乘以函数递归调用的数字,并且我放置了一个if(num == 0)语句返回1.尽管感谢提示!了解我的错误。 – Mozein

1

您需要首先初始化值为x的值。

var x = 1; 
1

让我们研究一下detaily发生了什么事:

f(3) = 3 * f(2); 
f(2) = 2 * f(1); 
f(1) = 1 * f(0); 

对于f(0),它直接进入return x;,而你的全局变量var x;尚未被初始化,从而f(0)回报undefined,并1 * factorial(0)得到NaN,传播到最终的结果。

一种解决办法是不使用全局变量:

function factorial(num) 
{ 
    var x = 1; 
    if (num > 0) { 
     x = num * factorial(num - 1); 
    } 
    return x; 
} 
console.log(factorial(3)); // 6 
+3

解释不正确。 'factorial(0)'返回'undefined',而不是'NaN'。 'NaN'发生在'factorial(1)','1 * factorial(0)',并传播到所有更高的数字。 – Amadan

+1

@Amadan谢谢你!更新。 – coderz