2016-07-03 4 views
0

再帰を使用して範囲を取得しようとしています。誰かが私になぜそれが働いていないと説明することができますか?JavaScriptで再帰を使用して範囲番号を取得する

function range(x,y){ 
    var results = []; 
    if(x === y){ 
     return results; 
    } 



return results.push(range(x + 1,y)); 
} 

range(1,5); 
+0

push [配列を返しません](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push)。 – 1983

答えて

1

結果は実際には何も入れていないので、常に空になります。仕事とは何

は、再帰の美しさは、あなたがローカル変数(var results)を必要としないということである。この

function range(x,y){ 
    var results = []; 
    if(x === y){ 
     return results; 
    } 
    results.push(x); 
return results.concat(range(x + 1,y)); 
} 

range(1,5); 
+1

本文を 'return x> = yに単純化できますか? – 1983

+0

@ 1983 nice one;) しかし、私は彼が説明を必要とするかもしれないと思ったので、それをそのまま残してコードを修正しましたが、彼のために物事を複雑にしたくなかった。 – MoustafaS

+0

確かに、コメントしていただけです。 OPのコード内の 'results'は空ではありません:' x 1983

1

です。あなただけの各再帰反復に引数として状態を渡す:

const concat = (xs, y) => xs.concat(y); 

const range = (x, y) => { 
    const rec = (x, y, acc) => x < y ? rec(x + 1, y, concat(acc, x)) : acc; 
    return rec(x, y, []); 
} 

ES5バージョンをする場合には、矢印構文に精通していない。しかし最もエレガントなソリューションではありません

function concat(xs, y) { 
    return xs.concat(y); 
} 

function range(x, y) { 
    function rec(x, y, acc) { 
    return x < y ? rec(x + 1, y, concat(acc, x)) : acc; 
    } 

    return rec(x, y, []); 
} 

再帰を使用すると、各再帰呼び出しでスタックを簡単に構築できます。各スタックフレームは、計算された部分的な結果を含む。

const range = (x, y) => x < y ? [x].concat(range(x + 1, y)) : []; 

以上の機能::

const concat = (xs, y) => xs.concat(y); 
const range = (x, y) => x < y ? concat([x], range(x + 1, y)) : []; 

concat([x], range(x + 1, y))はベースケース再帰的なケースと[]であることを、我々はただスタックをアンワインドし、配列にそれぞれ部分的な結果を添付する必要があります。

関連する問題