2012-04-03 73 views
0

有人可以直观地解释这里发生了什么。另一个递归JavaScript函数

var stack = []; 

function countDown(int) { 
    stack.push(int); 
    if (int === 1) { 
     return 1; 
    } 
    return countDown(int - 1); 
} 

function multiplyEach() { 
    // Remove the last value of the stack 
    // and assign it to the variable int 
    int = stack.pop(); 
    x = stack.length; 
    // Base case 
    if (x === 0) { 
     return int; 
    } 
    // Recursive case 
    else { 
     stack[x - 1] = int * stack[x - 1]; 
     return multiplyEach(); 
    } 
} 

//调用函数

countDown(7); 

//然后打印出来()

console.log(multiplyEach()); 

我有几分明白,就是它的堆叠建立并乘以multiplyEach返回的值一切都在一起,但我无法想象它。

然后:

Stack[x-1] is getting me 
+0

这个问题看起来不完整。你做完了吗? – kojiro 2012-04-03 12:40:16

+0

良好的格式是开始理解代码的好方法 – 2012-04-03 12:41:00

+0

我在试图了解的手机上。格式不完美。这就是我的全部答案。问题已完成 – Sam 2012-04-03 12:48:48

回答

1

这是一个两部分算法。

首先countDown(n)填充阵列stack与来自n值下降到1,所以stack = [n, n-1, n-2, ..., 3, 2, 1]countDown的返回值从不使用,因此可以忽略return语句。唯一重要的是它按照说明填充stack数组。

其次,multiplyEach反复取堆的最后一个元素,将其删除,与阵列中的下一个最后一个元素相乘:

[n, n-1, n-2, ..., 6, 5, 4, 3, 2, 1] 
[n, n-1, n-2, ..., 6, 5, 4, 3, 2] 
[n, n-1, n-2, ..., 6, 5, 4, 6] 
[n, n-1, n-2, ..., 6, 5, 24] 
[n, n-1, n-2, ..., 6, 120] 
... 
[n!] 

换句话说,该算法计算数的阶乘n给予countDown

0

int被设置为最后一个数组元素的值并除去从阵列,x被设定为后pop长度stack阵列的,所以stack[x-1]是获取“新”数组的最后一个元素。如果数组中还有东西,它将乘以int和新的最后一个元素(先前是倒数第二个元素),并将其存储为数组的最后一个元素。然后再次调用该过程,直到数组为空并且所有数字相乘。

1
function countDown(int) { 
    stack.push(int); 
    if (int === 1) { 
    return 1; 
    } 
    return countDown(int - 1); 
} 

这个函数是整型值递归地增加了堆栈变量,当函数最终返回堆栈包含数字从int到1

详细这里是如何此功能工作

1-推INT到堆栈 2-如果int是等于1返回 3-否则调用COUNTDOWN(INT-1)

函数将递归调用自身,并保持推动INT到t他直到堆栈变为1,所以最后的堆栈变量包含范围[int, int-1, int-2, ... 1]。下列行示出了堆​​叠阵列的状态的功能倒计时每次迭代

[int] 
[int, int-1] 
[int, int-1, int-2] 
[int, int-1, int-2, int-3] 
[int, int-1, int-2, int-3, int-4] 
.... 
[int, int-1, int-2, int-3, int-4,......1] 

该数组然后由multipyEach功能

function multiplyEach() { 
    // Remove the last value of the stack and assign it to the variable int 
    int = stack.pop(); x = stack.length; 
    // Base case 
    if (x===0) { 
    return int; 
    } 
// Recursive case 
    else { 
    stack[x - 1] = int * stack[x - 1]; 
    return multiplyEach(); 
    } 
} 

该函数从阵列中移除的最后一个元件和后将它乘以数组中的前一个数字并将其存储在该先前的位置(stack[x - 1] = int * stack[x - 1];)。同样,这个函数会一直调用它自己,直到数组的大小变为0,这将导致int内部的数字是它的阶乘。下面是每次迭代后数组的状态multiplyEach

[int, int-1, int-2, int-3, .... 4, 3, 2, 1] 
[int, int-1, int-2, int-3, .... 4, 3, 2] 
[int, int-1, int-2, int-3, .... 4, 6] 
[int, int-1, int-2, int-3, .... 24] 
. 
. 
[int!]