2017-01-31 1 views
2

나는 이것을 이해하지 못합니다!JavaScript에서 재귀를 이해할 수 없습니다.

function rec(arg){ 
    console.log(arg); 
    if(arg == 3) 
     return arg; 
    else 
     rec(arg + 1); 
} 

var i = rec(0); 
console.log(i); 
//0 
//1 
//2 
//3 
//undefined 

이유 함수 'ARG'내부 값을 갖지만`의 시간이 (', 인수 == 3')를 반환 할 때 나 '미정의'범?

여기서 다른

function power(base, exponent) { 
console.log(exponent); 
if (exponent == 0) 
    return 1; 
else 
    return base * power(base, exponent - 1); 
} 

console.log(power(2, 3)); 
//3 
//2 
//1 
//0 
//8 

왜 반환하지 '8'지수 것은 '함수 내에서'0 '이며 반환한다 때'1 '!

이제 JS가 어떻게 작동하는지 이해할 수 없다는 것을 이해합니다.

첫 번째 예에서

답변

3

, 당신은 라인을 작성해야

경우 (ARG의 == 3) 반환 인수, 그렇지 REC (ARG + 1); 이

경우 (ARG == 3) 복귀 인수로서

, 그렇지 REC (ARG + 1);

번째 예에서

하면

복귀베이스 * 파워 (기재, 지수 - 1) 행을 변경한다;

창 Math.pow (베이스 지수)하는 단계; 첫 번째 예에서, 당신이해야합니다

편집

(실제로, 당신은 단지 펑()에 대한 호출로 전체 기능을 교체해야합니다, 당신은 그것을 다시 작성할 필요가 없습니다) 도시를 여러 줄로 나누었을 때, 단순한 실수로 보았을 것입니다. 그래서,이 같은 : 때 shouldn

if(arg == 3) 
    return arg; 
else 
    return rec(arg + 1); 

그리고 후손과 좋은 습관

, 그것은 두 번째 예에서

if(arg == 3) { 
    return arg; 
} 
else { 
    return rec(arg + 1); 
} 

(즉, 괄호를 사용)과 같이해야합니다, 당신은 재귀를 사용 있네. Math.pow()에 대한 간단한 호출만으로 필요한 모든 것입니다. 비헤이비어를 로깅하려는 경우가 아니면 해당 함수를 다시 작성할 필요가 없습니다.

편집 :

의견을 읽은 후에 실수. 사과드립니다.

흐름은 다음과 같이 진행됩니다

콘솔.log (power (2, 3)); 행 라인 선에

if (1 == 0) 
    return 1; 
else 
    return 2 * power(2, 1 - 1); //power() returns 1, we return 2 
    //same as: return 2 * power(2, 0); 

다음 줄에 다음

if (2 == 0) 
    return 1; 
else 
    return 2 * power(2, 2 - 1); //power() returns 2, we return 4 
    //same as: return 2 * power(2, 1); 

에 다음

if (3 == 0) 
    return 1; 
else 
    return 2 * power(2, 3 - 1); //power() returns 4, we return 8 
    //same as: return 2 * power(2, 2); 

에 다음

if (0 == 0) 
    return 1; 
else 
    // moot 
+0

둘째는 유효한 함수입니다. 나는 왜 그것이 효과가 있는지 얻지 못했습니다. 그렇습니다. 나는 pow를 다시 쓰지 않아도된다는 것을 안다. 나는 이해하지 못하는 모범을 보였습니다. –

+0

전원 (2, 3)이되었을 것이다 : 2 * 4 인 2 * (2^2) ...이다 2 * (2^3-1) ... ... 8입니다. 전원을 반환 한 경우 (2,3) 반환 전원 (기본, 지수)으로 정의한 경우; 괜찮을 것입니다. – Wigwam

+0

감사합니다! 친절하게도! –

3

당신이 말하지 않기 때문에.

function rec(arg){ 
    console.log(arg); 
    if(arg == 3)return arg; 
    else rec(arg + 1);  // < --- not a return statement 
} 
var i = rec(0);console.log(i); 

else 블록은 return 문이 아닙니다.

그리고 0가 어딘가에 선을 아래로 함수에 중첩 호출에서오고 있기 때문에 두 번째 질문에 관해서는, 즉 : 이전 답변은 사실에 입각하여 올바른 정보를 제공하는 동안

base * power(base, exponent - 1); // power(base, exponent - 1) would return 1 here, and base is probably 8 at that moment, so 8 * 1 would return you 8 
+0

줄에서 'if (arg == 3) RETURN arg;라고 말한 것 같습니다.' –

+0

0 번에서 처음으로 돌아 오라는 지시 만받습니다. 두 번째, 세 번째 및 네 번째 호출은 보낸 사람에게 절대 반환되지 않습니다. – maksymiuk

+0

그것에 대해 생각해 보자. 값 0을 보냈고 3이 리턴하고 리턴한다고한다면, 리턴하지 않는다. 리턴하는 명령문이 없으므로 반환 할 것이 없다. – maksymiuk

1

, 그들은하지 않습니다 당신이 오해하고있는 것을 다루십시오.

두 경우 모두 재귀 함수가 마지막 (가장 안쪽에있는) 호출의 반환이 될 것으로 기대합니다. 그건 잘못된거야.

가장 안쪽의 호출로부터의 반환은 2 번째에서 가장 안쪽의 호출에 주어집니다. 마지막으로 가장 바깥 쪽 호출이 반환 될 때까지 계속됩니다. 가장 바깥 쪽 호출의 반환 값만 호출자가 볼 수 있습니다.

첫 번째 예에서는 rec(0)으로 전화를 겁니다. rec(0)rec(1), 을 호출하며 rec(2), 을 호출하며 rec(3)을 호출합니다.

rec(3)3rec(2)으로 반환합니다 (아직 실행 중이기 때문에). rec(2)rec(1) 으로 돌아 오지 않고 종료되며 rec(0) 으로 돌아 오지 않고 발신자에게 반송되지 않고 종료됩니다.

그래서 호출자는 반환 값을 정의되지 않은 것으로 봅니다. 두 번째 경우

는, 그래, power()의 마지막 호출 등 power(2,1) power(2,2)

의 실행 호출에 2를 반환 의 실행 호출에 ... 1을 반환 power(2,0) ... 그리고 호출자가 본 마지막 반환이 8이 될 때까지.

그런데 이것은 "JavaScript에서 재귀"가 아닙니다. 이것은 재귀입니다.

+0

너무나 빨리 내가 ​​그런 철저한 anwser를 기대하지 않았던 것을 고맙다! !! –

관련 문제