为什么我不能 return 来自递归函数的值?
Why i can't return value from recursive function?
我正在解决 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
但是在递归完成后我想return从 findMinAndMax
到原始调用者的结果sumMiniMax
在那种情况下,我得到的只是未定义,但在我 return 值之前,我们可以看到在找到 10 and 14
的本地范围内的正确输出。这是为什么?
并非所有代码路径 return 一个值。您需要将结果传播到调用堆栈。在你的情况下
return sumMiniMax(arr, length);
在您的函数 sumMiniMax()
.
的 else 分支中缺失
我认为这种情况下的递归有点over-engineering。该任务有一个简单的方法:
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}
您可以采用单循环方法,将三个非最小值和非最大值相加,并保留最小值和最大值以备后用。
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]));
我正在解决 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
但是在递归完成后我想return从 findMinAndMax
到原始调用者的结果sumMiniMax
在那种情况下,我得到的只是未定义,但在我 return 值之前,我们可以看到在找到 10 and 14
的本地范围内的正确输出。这是为什么?
并非所有代码路径 return 一个值。您需要将结果传播到调用堆栈。在你的情况下
return sumMiniMax(arr, length);
在您的函数 sumMiniMax()
.
我认为这种情况下的递归有点over-engineering。该任务有一个简单的方法:
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}
您可以采用单循环方法,将三个非最小值和非最大值相加,并保留最小值和最大值以备后用。
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]));