【问题标题】: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,如果是则返回其中唯一的元素
  2. 如果不是:将列表中的第一个元素与第二个元素进行比较,最大的元素将被删除。新列表再次放入函数中以使其递归。
  3. 此过程一直持续到列表实际长度为 1,然后该函数将返回最小的数字。

为什么返回 1 而不是 0?

希望有人可以提供帮助 亲切的问候!

【问题讨论】:

  • Array.prototype.splice 返回删除的元素,而不是原始数组。此外,它还会改变数组。
  • function minimum(ns) { console.log(ns.join(',')); 简单调试...你看到你用什么来调用最小值?所以下一步,了解 splice 返回的内容。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript arrays recursion minimum


【解决方案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]));

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 2016-01-20
      • 2011-08-01
      • 1970-01-01
      相关资源
      最近更新 更多