2017-02-27 10 views
1

私は再帰の理解を深めようとしており、一般的な 'Fizzbuzz'問題を使って数値を持つ配列を作成しようとしています。私は1つの入力だけで純粋な再帰関数を実装することでこれを実行しようとしていますが、私の答えを正しい順序で表示することができません。私はまた、この状況で連結の代わりにプッシュを使用する純粋な再帰的​​関数を書く方法があるかどうかを知りたいと思っていました。どんな助けもありがとう!私は、希望の出力を印刷することができますが、逆の順序でそれをやっています。以下は私が今までに持っているものです:Javascript - 純粋な再帰関数を使用してFizzBu​​zz結果を持つ配列を作成する

var fizzBuzz = function(n) { 
    //create results array 
    //create base case for when n === 1 
    //recurse and push value to array 
    var results = []; 
    if (n === 1) { 
    return '1'; 
    } else { 
    if (n % 3 === 0 && n % 5 === 0) { 
     results.push('FizzBuzz'); 
    } else if (n % 5 === 0) { 
     results.push('Buzz'); 
    } else if (n % 3 === 0) { 
     results.push('Fizz'); 
    } else { 
     results.push(''+ n); 
    } 
    return results.concat(fizzBuzz(n - 1)); 
    } 
}; 
+0

を持つ関数内の関数は、あなたは最後に、アレイをrevereseする必要があります! –

答えて

2

これはさまざまな方法があり、要件によって異なります。

function fizzBuzz(n) { 
 
    function fizzBuzzRecursive(n) { 
 
    //create results array 
 
    //create base case for when n === 1 
 
    //recurse and push value to array 
 
    var results = []; 
 
    if (n === 1) { 
 
     return '1'; 
 
    } else { 
 
     if (n % 3 === 0 && n % 5 === 0) { 
 
     results.push('FizzBuzz'); 
 
     } else if (n % 5 === 0) { 
 
     results.push('Buzz'); 
 
     } else if (n % 3 === 0) { 
 
     results.push('Fizz'); 
 
     } else { 
 
     results.push(''+ n); 
 
     } 
 
     return results.concat(fizzBuzzRecursive(n - 1)); 
 
    } 
 
    } 
 
    
 
    return fizzBuzzRecursive(n).reverse(); 
 
}; 
 

 
console.log(fizzBuzz(15));

時々、それは(それは醜いに見えるかもしれませんが、それはコード内で最小限の変更であなたの問題を解決します:最も簡単な方法は、最終的にはあなたの配列を逆にすることであるの

ワン重要な要件)。

別の解決方法は、代わりにfizzBuzzRecursiveresultsに連結することです。それを動作させるには、n == 1の場合は"1"の代わりに[1]を返す必要があるので、JSは最初の結果を文字列ではなく配列として解釈します。

function fizzBuzz(n) { 
 
    //create results array 
 
    //create base case for when n === 1 
 
    //recurse and push value to array 
 
    var results = []; 
 
    if (n === 1) { 
 
    return ['1']; // ! 
 
    } else { 
 
    if (n % 3 === 0 && n % 5 === 0) { 
 
     results.push('FizzBuzz'); 
 
    } else if (n % 5 === 0) { 
 
     results.push('Buzz'); 
 
    } else if (n % 3 === 0) { 
 
     results.push('Fizz'); 
 
    } else { 
 
     results.push(''+ n); 
 
    } 
 
    return fizzBuzz(n - 1).concat(results); 
 
    } 
 
}; 
 

 
console.log(fizzBuzz(15));

第三の溶液は、それが逆の順序で反復するように、あなたの再帰関数を変更することです。あなたはそれを自分で試してください:)

+0

ありがとうございますYeldar!私の目標は、内部関数を利用しないソリューションを実装することでした。ハッピーコーディング! –

0

別の解決策をどの0(ちょっと)から繰り返し処理:https://repl.it/FysV/1

var hold = 0; 
var fizzBuzz = function(n) { 
    var results = []; 

    if(hold === n) return '' + n; 

    if(hold === 0) { 
    hold = n; 
    n = 1; 
    } 

    if (n === 1) { 
    results.push('1'); 
    } else if (n % 3 === 0 && n % 5 === 0) { 
    results.push('FizzBuzz'); 
    } else if (n % 5 === 0) { 
    results.push('Buzz'); 
    } else if (n % 3 === 0) { 
    results.push('Fizz'); 
    } else { 
    results.push(''+ n); 
    } 

    return results.concat(fizzBuzz(n + 1)); 
} 
0

最初のアプローチ:parametterとして配列を渡す

var fizzBuzz = function(n, arr = []) { // fizzBuzz should have two params: the number n and the accumulated array arr 
 
    
 
    // if you don't like the arr = [] in the parametter, or if it's not supported then just declare arr as a regular argument (function(n, arr)) and uncomment the following line to check if the array is passed or not (in the first call) 
 
    // arr = arr || []; 
 
    
 
    if (n === 1) {       // if n is 1 then add 1 to the array and return its inverse because we didn't fuzzBuzz in the right order 
 
    arr.push('1'); 
 
    return arr.reverse(); 
 
    } else {        // logic blah blah ... 
 
    if (n % 3 === 0 && n % 5 === 0) { 
 
     arr.push('FizzBuzz'); 
 
    } else if (n % 5 === 0) { 
 
     arr.push('Buzz'); 
 
    } else if (n % 3 === 0) { 
 
     arr.push('Fizz'); 
 
    } else { 
 
     arr.push('' + n); 
 
    } 
 
    return fizzBuzz(n - 1, arr);   // no need to use concat because we are passing the acummulated array to append to it 
 
    } 
 
} 
 

 
console.log(fizzBuzz(10));

第2のアプローチ: clossures

var fizzBuzz = function(n) { 
 
    var arr = [];      // the array 
 
    
 
    function fizzBuzzInternal(i) {  // the real fizzBuzz function 
 
    if (i % 3 === 0 && i % 5 === 0) { // logic blah blah ... 
 
     arr.push('FizzBuzz'); 
 
    } else if (i % 5 === 0) { 
 
     arr.push('Buzz'); 
 
    } else if (i % 3 === 0) { 
 
     arr.push('Fizz'); 
 
    } else { 
 
     arr.push('' + i); 
 
    } 
 
    
 
    if(i < n)       // if i is still less than n then invoke another fizzBuzzInternal call 
 
     fizzBuzzInternal(i + 1); 
 
    } 
 
    
 
    fizzBuzzInternal(1);    // invoke the first fizzBuzzInternal to start the show 
 
    
 
    return arr;       // return the array (no need for inversing because we fizzBuzzed in the right direction) 
 
} 
 

 
console.log(fizzBuzz(10));

関連する問題