再帰を使用して範囲を取得しようとしています。誰かが私になぜそれが働いていないと説明することができますか?JavaScriptで再帰を使用して範囲番号を取得する
function range(x,y){
var results = [];
if(x === y){
return results;
}
return results.push(range(x + 1,y));
}
range(1,5);
再帰を使用して範囲を取得しようとしています。誰かが私になぜそれが働いていないと説明することができますか?JavaScriptで再帰を使用して範囲番号を取得する
function range(x,y){
var results = [];
if(x === y){
return results;
}
return results.push(range(x + 1,y));
}
range(1,5);
結果は実際には何も入れていないので、常に空になります。仕事とは何
は、再帰の美しさは、あなたがローカル変数(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);
です。あなただけの各再帰反復に引数として状態を渡す:
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))
はベースケース再帰的なケースと[]
であることを、我々はただスタックをアンワインドし、配列にそれぞれ部分的な結果を添付する必要があります。
push [配列を返しません](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push)。 – 1983