這個問題在這里已經有了答案: 遞回函式回傳未定義 3 個答案 3天前關閉。
我正在解決hackerrank 上的mini-max 任務。
https://www.hackerrank.com/challenges/mini-max-sum/problem?isFullScreen=true
為此,我有以下代碼,我在其中使用遞回,直到達到陣列長度
let arr = [1,2,3,4,5];
let sumsArr = [];
function sumMiniMax(arr, length) {
let sum = 0;
for(let i = 0;i < arr.length;i ) {
if(i != length) {
sum = arr[i];
}
}
sumsArr.push(sum);
length = length 1;
if(length == arr.length) {
let result = findMinAndMax(sumsArr);
console.log('result local', result);
return result
} else {
sumMiniMax(arr, length)
}
}
function findMinAndMax(sumsArr) {
return Math.min(...sumsArr) '\n' Math.max(...sumsArr)
}
let res = sumMiniMax(arr, 0);
console.log('res', res);
在本地結果中,我得到了預期的輸出10 and 14,但是在遞回完成后,我想將結果回傳 findMinAndMax給原始呼叫者,即sumMiniMax
在這種情況下,我得到的只是 undefined 但在我回傳值之前,我們可以看到在 find 的本地范圍內的正確輸出10 and 14。這是為什么 ?
uj5u.com熱心網友回復:
并非所有代碼路徑都回傳值。您需要將結果傳播到呼叫堆疊。在你的情況下
return sumMiniMax(arr, length);
函式的 else 分支中缺少sumMiniMax()。
uj5u.com熱心網友回復:
您可以通過將三個非最小值和非最大值相加來采用單回圈方法,并保留最小值和最大值以供以后添加。
function getMinMax(array) {
let min = array[0] < array[1] ? array[0] : array[1],
max = array[0] > array[1] ? array[0] : array[1],
sum = 0;
for (let i = 2; i < array.length; i ) {
const value = array[i];
if (min > value) {
sum = min;
min = value;
continue;
}
if (max < value) {
sum = max;
max = value;
continue;
}
sum = value;
}
return [min sum, max sum].join(' ');
}
console.log(getMinMax([1, 2, 3, 4, 5]));
uj5u.com熱心網友回復:
我認為在這種情況下遞回是一種過度設計。該任務有一個簡單的方法:
function miniMaxSum(arr) {
const sumWithout = (el) => {
const elIndex = arr.indexOf(el);
const arrWithout = arr.filter((_, i) => i !== elIndex);
return arrWithout.reduce((sum, num) => sum num);
};
const maxEl = Math.max(...arr);
const minEl = Math.min(...arr);
console.log(sumWithout(maxEl), sumWithout(minEl));
};
miniMaxSum([1,2,3,4,5]);
.as-console-wrapper{min-height: 100%!important; top: 0}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/446423.html
標籤:javascript 数组 算法
