我想使用遞回來通過指定的步驟找到給定整數的范圍。
given number --> -20
step --> 4
returns --> [ -20, -16, -12, -8, -4, -2, 0, 2, 4 ]
到目前為止,我已經能夠創建一個遞回函式來回傳相應的結果:
function range(num,step,res=[]) {
const s = num < step ? step : -step;
if (num === step s) return res;
return num === step ? [...res,num] : range(num s,step,[...res,num]);
}
console.log(range(5,1)); // [ 5, 4, 3, 2, 1 ]
console.log(range(-8,2)); // [ -8, -6, -4, -2, 0, 2 ]
console.log(range(-20,4)); // [ -20, -16, -12, -8, -4, -2, 0, 2, 4 ]
但是,以下呼叫回傳 stackoverflow
console.log(range(-7,2)); // stackoverflow!
console.log(range(11,5)); // stackoverflow!
我知道代碼有問題,但我就是不知道它是什么。有人可以指出我正確的方向或告訴我我做錯了什么。百萬提前感謝:)
更新:
感謝 TazHinkle 的控制流程,我們能夠解決以下問題:
function range(num,step,res=[]) {
const s = num < step ? step : -step;
if (num > step && num < step) return res;
if (num < step && num s > step) return [...res,num];
return num === step ? [...res,num] : range(num s,step,[...res,num]);
}
console.log(range(5,1)); // [ 5, 4, 3, 2, 1 ]
console.log(range(-8,2)); // [ -8, -6, -4, -2, 0, 2 ]
console.log(range(-20,4)); // [ -20, -16, -12, -8, -4, 0, 4 ]
console.log(range(11,5)); // [ 11, 6, 1 ]
console.log(range(-7,2)); // [ -7, -3, -5, -1, 1 ]
console.log(range(-9,4)); // [ -9, -5, -1, 3 ]
uj5u.com熱心網友回復:
case range(-7,2) 在當前版本中無法決議,因為它將在 1 和 3 之間無限步進(因為它步進 2 并試圖到達 2,但它永遠不會到達)。當它過去時,你可以讓它放棄,如下所示:
function range(num,step,res=[]) {
const s = num < step ? step : -step;
const forward = num < step ? true : false;
if (num === step s) return res;
if(forward) {
if(num s > step) {
return [...res,num]
}
return num === step ? [...res,num] : range(num s,step,[...res,num]);
}else {
if(num s < step) {
return [...res,num]
}
return num === step ? [...res,num] : range(num s,step,[...res,num]);
}
}
uj5u.com熱心網友回復:
這是假設您的目標是從第一個引數開始,然后逐步下降,直到最后一個數字為 0、1 或 -1(基本上盡可能接近零)。
首先,不要翻轉step到/從 neg/pos,將 neg 轉換為 pos 并為 neg 步驟設定一個標志:
if (num < 0) {
n = Math.abs(num);
neg = true;
} else n = num;
洗掉這個額外的步驟,奇數引數無法停止:
if (num === step s) return res;
此行的唯一區別是<代替===. 這將使奇數接近 0,偶數接近零:
let result = n < step ? [n, ...res] : rangeToZero(n -step, step, [n, ...res]);
最后,如果neg == true我們將每個數字都設為負數(感覺就像在作弊):
if (neg) {
return result.map(N => -Math.abs(N));
}
function rangeToZero(num, step, res=[]) {
let n, neg = false;
if (num < 0) {
n = Math.abs(num);
neg = true;
} else n = num;
let result = n < step ? [n, ...res] : rangeToZero(n -step, step, [n, ...res]);
if (neg) {
return result.map(N => -Math.abs(N));
}
return result;
}
console.log(rangeToZero(5,1)); // [ 5, 4, 3, 2, 1, 0 ]
console.log(rangeToZero(-8,2)); // [ -8, -6, -4, -2, 0 ]
console.log(rangeToZero(-20,4)); // [ -20, -16, -12, -8, -4, 0 ]
console.log(rangeToZero(10, 3)); // [ 10, 7, 4, 1 ]
console.log(rangeToZero(-7,2)); // [ -7, -3, -5, -1 ]
console.log(rangeToZero(11,5)); // [ 11, 6, 1 ]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/446415.html
標籤:javascript 算法 递归 ecmascript-6 范围
下一篇:如何從陣列中洗掉多個元素?
