2016-11-15 6 views
-1

私は肯定的なパラメータnumを取り、その乗法的な持続性を返す関数(永続性)を書いたがっています。これは、数字の1桁に達するまでnumの桁を掛けなければならない回数です。たとえば :再帰的クロージャはどのようなものに戻りますか?

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 

私はこれを書いた:あなたはこのコードを実行している見ることができるように

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;} 
    } 

} 

を、内部関数の戻り値は予想まさにではありません。 実際、関数は呼び出された場所に戻ります。しかし、この場合は再帰的なので、それ自体から呼び出されます。 私は(グローバル変数を使用せずに)実際の値を取得する方法が分からない

+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は廃止され、しかもネストされた関数を使用すると複雑すぎることになります。

あなたはこのようにそれを行うことができます。FYI

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]); 
関連する問題