目前,我能夠獲得以下函式來通過遞回從陣列中檢索最大值
const max = ([a,...rest]) => !rest.length || a > max(rest) ? a : max(rest);
console.log(max([-3,3,19,61,99,22,55])); // 99
console.log(max([32,0,9,87,73])); // 87
console.log(max([1,6,8])); // 8
但是,當我嘗試通過解構使用額外的引數“b”對其進行重構時,整個函式將不再正常作業。
const max = ([a,b,...rest]) => !rest.length || a > b ? a : max([b,...rest]);
console.log(max([-3,3,19,61,99,22,55])); // 99
console.log(max([32,0,9,87,73])); // 32
console.log(max([1,6,8])); // 6
有人可以解釋我做錯了什么或指出我正確的方向。我是遞回和編程的新手,因此將不勝感激任何幫助:)
uj5u.com熱心網友回復:
您想要修復初始遞回版本是絕對正確的。呼叫max (rest)兩次,并為每個隨后較小的串列遞回地執行它意味著您呼叫了max2 n次,其中n是輸入的長度。(更復雜的是n,它會隨著奇數或偶數的不同而變化,但它仍然以這個速度增長。)
所以你確實需要解決這個問題。但是正如評論中已經報道的那樣,您的嘗試有幾個致命的缺陷。首先,很有可能您解構的引數比串列中的元素多。(會是什么b?max ([42]))其次,當你得到兩個元素(!rest .length)時,你總是回傳第一個。如果第二個更大怎么辦?
我的方法可能是添加一個最多兩個元素的輔助函式,然后用它來撰寫主函式。它可能看起來像這樣:
const max2 = (a, b) => a > b ? a : b
const max = ([a, ...rest]) =>
rest .length == 0 ? a : max2 (a, max (rest))
console.log (max ([-3, 3, 19, 61, 99, 22, 55])); // 99
console.log (max ([32, 0, 9, 87, 73])); // 87
console.log (max ([1, 6, 8])); // 8
當然,我們總是可以使用 來代替輔助函式,Math .max但這有點作弊。
如果您對輔助函式有強烈的反感,則可以使用默認引數。但我認為這段代碼更復雜,而且不是很有幫助:
const max = ([a, ...rest], b = rest.length ? max (rest) : -Infinity) =>
rest .length == 0 ? a : a > b ? a : b
在這里,我們使用-Infinity保證不大于任何其他值的值。這在片段版本中也可能有用。現在,如果您傳遞max一個空陣列,它會回傳undefined. 如果我們希望它回傳-Infinity,那么我們可以默認a為-Infinity:
const max = ([a = -Infinity, ...rest], b = rest.length ? max (rest) : -Infinity) =>
rest .length == 0 ? a : a > b ? a : b
max ([]) //=> -Infinity
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/445488.html
標籤:javascript 数组 递归 ecmascript-6
上一篇:為什么這個快速排序會溢位?
