2017-07-26 3 views
2

再帰的方法を使用して配列内の任意の数値のすべての桁を保存する関数を作成しようとしていますが、ループは仕事ではない、誰かが私が何を間違っていたか教えてくれますか?は、再帰関数を使用して、arrの数値の各桁を格納します。

function digit(n) { 
    var arr = []; 
    if (n < 10) { 
     return arr.push(n); 
    } else { 
     var dig = n % 10; 
     arr.push(dig); 
     digit(Math.floor(n/10)); 
    } 
    return arr; 
} 
+0

を桁に番号をsplite _easier_方法があるので、そのタスクのための再帰関数を使用するのrequirmentです。 –

答えて

0

再帰は正しいですが、正しく返された値を使用していない、あなただけがやっている方法は、あなたが配列の連続したメソッドの呼び出しから返さCONCATする必要がある最後の数字を返します。このような何かが動作するようです:あなたは空の配列に毎回arrをリセットするので、それはどこにも取得することはありません

function digit(n){ 
 
    var arr = []; 
 
    if(n<10){ 
 
     arr.push(n); 
 
    }else{ 
 
     var dig = n % 10; 
 
     arr.push(dig); 
 
     arr = arr.concat(digit(Math.floor(n /10))); 
 
    } 
 
    return arr; 
 
} 
 
console.log(digit(999));

+0

提案していただきありがとうございます – Sen123

+0

@ Sen123あなたが大歓迎ですが、その助けがあれば、回答を受け入れることを検討してください。乾杯! – Dij

1

。あなたは再帰関数の外にそれを格納し、最後にそれを返す必要があります。

function digit(d) { 
 
    var arr = []; 
 
    
 
    function store_digit(n) { 
 
     if (n < 10) { 
 
      return arr.push(n); 
 
     } else { 
 
      var dig = n % 10; 
 
      arr.push(dig); 
 
      store_digit(Math.floor(n/10)); 
 
     } 
 
    } 
 
    
 
    store_digit(d); 
 
    console.log(arr) 
 
    return arr; 
 
} 
 

 
digit(682)

+0

これを指摘していただきありがとうございます。 – Sen123

+0

'Array#push'は配列の新しい長さを返します。配列自体は返しません。 – Will

+0

@wilusdaman - 良いキャッチ。私は元のポストで構文を借りているだけです。実際には 'store_digit'から返されるものは何も割り当てられていません。しかし、あなたは正しいのですが、それは 'arr.push(n)の短縮形になります。関数には 'if'ブロックと' else'ブロックしか含まれていないので、 'if'が実行されるとすぐに終了するので、これは不要です。 –

0

コードは、すべての数字を介して実行されています。関数が実行されるたびに配列を初期化するので、最後に実行した桁を返すだけです。

var arr = []; 
function digit(n) { 
    if (n < 10) { 
    return arr.push(n); 
    } 
    else { 
    var dig = n % 10; 
    arr.push(dig); 
    digit(Math.floor(n/10)); 
    } 
} 
digit(123456789) 
console.log(arr) 
+0

このようなタスクにグローバル変数を使用しないでください。例えば'arr'をリセットしないと関数を2回使用すると失敗します。 –

-1

コード:

はこの1つ試してみてください

var arr = []; 

function digit(n){ 

    if (n<10) { 
     return arr.push(n); 
    } else { 
    var dig = n % 10; 
    arr.push(dig); 
    digit(Math.floor(n /10)); 
    } 
    return arr; 

} 
+0

put arr outside – Allen

+0

ここでグローバル変数を使用するのは悪い考えです。なぜなら、この関数を呼び出すたびにこの変数をリセットする必要があるからです。このような設定はエラーが発生しやすく、使用すべきではありません。 –

0
digit(123456); 

function digit(n) { 
    var arr = []; 
    if (n < 10) { 
     arr.push(n); 
    } else {  
    numberToString = n.toString(); 

    for (var i = 0, len = numberToString.length; i < len; i += 1) { 
     arr.push(+numberToString.charAt(i)); 
    } 

     console.log(arr); 
    } 

} 
0

をこれまでに与えられたすべての答えは正しい考えを持っています。ここではそのアイデアは、もう少し簡単に表現しています:

function digits(n, result=[]){ 
    return n < 10 
     ? result.concat([n]).reverse() 
     : digits(Math.floor(n/10), result.concat([n % 10]); 
} 

digits(1234); //=> [1, 2, 3, 4] 

を期待される出力ではなく、最小の最大よりも最大の順に小さいために行く場合は、.reverse()を削除することができます。

demo

0

あなたは、関数のすべての呼び出しが有効な部分の結果を返すクリーンなアプローチを、使用することができます。

nの値が10より小さい場合は、最初にrecursion teminationを定義します。この場合、値を持つ配列を返します。他のすべての場合には

、あなたは1010による除算の残りをCONCATで割っnの整数値の再帰呼び出しの結果を返します。

この提案では、別の明示的な一時変数は使用しません。より簡潔なスタイルのために

function getDigits(n) { 
 
    if (n < 10) { 
 
     return [n]; 
 
    } 
 
    return getDigits(Math.floor(n/10)).concat(n % 10); 
 
} 
 

 
console.log(getDigits(123456));

、あなたは上記と同じ考え方で三元を使用することができます。スプレッド演算子使用

function getDigits(n) { 
 
    return n < 10 ? [n] : getDigits(Math.floor(n/10)).concat(n % 10); 
 
} 
 

 
console.log(getDigits(123456));

0

function getDigits(num, radix = 10) { 
    return num < radix ? 
     [num] : 
     [...getDigits(Math.floor(num/radix), radix), (num % radix)]; 
} 
getDigits(0xCAFEBABE, 0x10); 
// ==> [12, 10, 15, 14, 11, 10, 11, 14] 
関連する問題