2012-04-03 4 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

+0

좋은 서식을 사용하면 코드를 쉽게 이해할 수 있습니다. –

+0

나는 이해하려고 전화를합니다. 형식이 완벽하지 않습니다. 그게 내가 가진 전체 답이다. 질문이 완료되었습니다. – Sam

답변

1

두 부분으로 구성된 알고리즘입니다. 우선 countDown(n)

1는 아래로 n의 값으로 상기 어레이 stack 때문에 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이 지정됩니다.

0

int 마지막 배열 요소의 값으로 설정하고 어레이로부터 xstack 어레이의 포스트 pop 길이로 설정되는 것이 제거되고, 그래서 stack[x-1]는 "새로운"배열의 마지막 원소를 얻는다. 배열에 물건이 남아있는 경우에는 int과 새로운 마지막 요소 (이전에 두 번째부터 마지막까지)를 곱해서 배열의 마지막 요소로 저장합니다. 다음 배열이 비어 있고 모든 숫자가 함께 곱할 때까지 프로세스를 다시 호출합니다.

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

이 함수

를 작동하는 방법이 기능은 순환 스택 변수, 함수 결국 스택을 반환 할 때 여기에보다 상세히 INT 1.

에서 번호가 포함되는 INT의 값을 가산한다 스택에

1- 푸시 INT 2- INT가 같으면 1 창 -3- 달리 호출 카운트 (INT-1)

함수가 자신을 재귀 적으로 호출을 t INT 추진 유지할 그는 int가 1이 될 때까지 스택합니다. 결국 스택 변수는 범위 [int, int-1, int-2, ... 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(); 
    } 
} 

이 함수는 어레이에서 마지막 요소를 제거하고 사용됩니다

[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] 

함수 카운트의 각 반복 후 스택 어레이의 상태를 도시 배열의 이전 숫자와 곱해서 이전 위치 (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!]