使用递归函数查找数组的最小数量
Posted
技术标签:
【中文标题】使用递归函数查找数组的最小数量【英文标题】:Finding the smallest number of an Array using a recursive function 【发布时间】:2021-12-23 08:39:18 【问题描述】:我有一个任务,我需要使用 递归函数 找到数组中的最小数字。需要明确的是:我已经获得了一个可行的解决方案。我只是一辈子都想不通为什么我自己的算法不起作用。
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?
希望有人可以提供帮助 亲切的问候!
【问题讨论】:
Array.prototype.splice
返回删除的元素,而不是原始数组。此外,它还会改变数组。
function minimum(ns) console.log(ns.join(','));
简单调试...你看到你用什么来调用最小值?所以下一步,了解 splice 返回的内容。 developer.mozilla.org/en-US/docs/Web/javascript/Reference/…
【参考方案1】:
你需要在调用之外进行拼接,因为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]));
另一种方法可以更好地帮助分离第一个元素并获取数组的其余部分。
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]));
【讨论】:
【参考方案2】:你可以使用destructuring assignment,而不是Array.slice()
和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]));
【讨论】:
以上是关于使用递归函数查找数组的最小数量的主要内容,如果未能解决你的问题,请参考以下文章