2016-11-15 4 views
-1

긍정적 인 매개 변수 num을 취하여 하나의 숫자에 도달 할 때까지 num에서 숫자를 곱해야하는 횟수 인 곱셈 지속성을 반환하는 함수 (지속성)를 작성하려고합니다. 예를 들어 는 :재귀 클로저는 무엇을 반환합니까?

function persistence(num) { 
    //code me 
    var f; 
    f= countPersistence(num); 
    var toReturn= f(num); console.log("received value: "+toReturn); 
    return toReturn; 
} 

function countPersistence(num){ 
    var count=0; 
    return function g(num){ 
    var numt=num+""; 
    numt=numt.split(""); 
    if(numt.length>1){ 
     count++; 
     for(var i=0; i<numt.length-1; i++){ 
     numt[i+1]=numt[i]*numt[i+1]; 
     } 
     arguments.callee(numt[numt.length-1]); 
    } 
    else 
     { console.log("returned value: "+count); return count;} 
    } 

} 

이 코드를 실행 볼 수 있듯이, 내부 함수의 반환 값이 예상 정확히되지 않습니다 :

persistence(39) === 3 // because 3*9 = 27, 2*7 = 14, 1*4=4 
         // and 4 has only one digit 

persistence(999) === 4 // because 9*9*9 = 729, 7*2*9 = 126, 
         // 1*2*6 = 12, and finally 1*2 = 2 

persistence(4) === 0 // because 4 is already a one-digit number 

나는이 썼다. 실제로 함수는 호출 된 곳으로 돌아와야합니다. 그러나이 경우 반복적이므로 자체에서 호출됩니다. 어떻게

+0

를 참고하시기 바랍니다 : arguments.callee를이 – epascarello

답변

0

내부 함수를 재귀 적으로 호출 할 때 값을 반환하지 않습니다. 당신은 항상 count의 마지막 업데이트 값이 반환되도록합니다 (else 블록을 제거하고 그것을 공통 코드를 만드는)이 같은 문제를 해결할 수 :

function persistence(num) { 
 
    //code me 
 
    var f; 
 
    f= countPersistence(num); 
 
    var toReturn= f(num); 
 
    return toReturn; 
 
} 
 

 
function countPersistence(num){ 
 
    var count=0; 
 
    return function g(num){ 
 
    var numt=num+""; 
 
    numt=numt.split(""); 
 
    if(numt.length>1){ 
 
     count++; 
 
     for(var i=0; i<numt.length-1; i++){ 
 
     numt[i+1]=numt[i]*numt[i+1]; 
 
     } 
 
     arguments.callee(numt[numt.length-1]); 
 
    } 
 
    return count; 
 
    } 
 
} 
 

 
console.log(persistence(39)); // 3 
 
console.log(persistence(999)); // 4 
 
console.log(persistence(4)); // 0

그러나 arguments.callee는 사용되지 않으며 또한 중첩 된 함수로 지나치게 복잡하게 만듭니다.

당신은 이런 식으로 작업을 수행 할 수 있습니다

function persistence(num){ 
 
    return num < 10 ? 0 
 
     : 1 + persistence(String(num).split('').reduce((a, b) => a*b)); 
 
} 
 

 
console.log(persistence(39)); // 3 
 
console.log(persistence(999)); // 4 
 
console.log(persistence(4)); // 0

+0

아 ....되지 않습니다! 그게 더 간단 해! 감사 :) –

0

당신은 재귀 라인

return arguments.callee(numt[numt.length-1]); 

을에 반환되지 않으며 내가 코멘트 arguments.callee를에 명시된대로 당신 때문에 사용되지 않습니다 (전역 변수를 사용하지 않고) 실제 값을 검색하는 방법 아무 생각이 없다 함수 이름을 사용해야합니다.

return g(numt[numt.length-1]); 
관련 문제