我有一個任務,我需要使用遞回函式在陣列中找到最小的數字。需要明確的是:我已經獲得了一個有效的解決方案。我只是一輩子都無法弄清楚為什么我自己的演算法不起作用。
function minimum(ns) {
if (ns.length === 1) {
return ns[0];
}
else {
const first = ns[0]
const second = ns[1]
if (first >= second) {
return minimum(ns.slice(1))
}
else {
return minimum(ns.splice(1,1))
}
}
}
minimum([0, 1]
這段代碼回傳 1 而不是零......我的想法如下:
- 首先檢查串列長度是否為1,如果是則回傳其中唯一的元素
- 如果不是:將串列中的第一個元素與第二個元素進行比較,最大的元素將被洗掉。新串列再次放入函式中以使其遞回。
- 這一直持續到串列的實際長度為 1,然后函式將回傳最小的數字。
為什么這回傳 1 而不是 0?
希望有人可以幫助親切的問候!
uj5u.com熱心網友回復:
您需要在呼叫之外拼接,因為Array#splice回傳陣列的已洗掉元素。
function minimum(ns) {
if (ns.length === 1) return ns[0];
const first = ns[0]
const second = ns[1]
if (first >= second) return minimum(ns.slice(1));
ns.splice(1, 1);
return minimum(ns);
}
console.log(minimum([0, 1]));
console.log(minimum([1, 0]));
console.log(minimum([5, 6, 3, 4, 7, 2, 1]));
Mabe 另一種方法將通過分離第一個元素并獲取陣列的其余部分來更好地提供幫助。
function minimum([first, ...ns]) {
if (ns.length === 0) return first;
if (first >= ns[0]) return minimum(ns);
return minimum([first, ...ns.slice(1)]);
}
console.log(minimum([0, 1]));
console.log(minimum([1, 0]));
console.log(minimum([5, 6, 3, 4, 7, 2, 1]));
uj5u.com熱心網友回復:
而不是Array.slice()and Array.splice,您可以使用解構賦值:
function minimum(ns)
{
if (ns.length === 1)
{
return ns[0];
}
const [first, second, ...tail] = ns;
if (first >= second)
{
return minimum([second, ...tail]);
} else {
return minimum([first, ...tail]);
}
}
或者
function minimum(ns)
{
if (ns.length === 1) return ns[0];
const [first, second, ...tail] = ns;
return minimum([(first >= second?second:first), ...tail]);
}
console.log(minimum([1]));
console.log(minimum([3,1,2]));
console.log(minimum([3,2,2,3,4]));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/355585.html
標籤:javascript 数组 递归 最低限度
