使用递归函数查找数组的最小数量

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]));

【讨论】:

以上是关于使用递归函数查找数组的最小数量的主要内容,如果未能解决你的问题,请参考以下文章

使用递归js在树状对象中查找最小值和最大值

在Java中的整数数组列表中找到最小值的递归函数

二分查找递归版以及书写递归的注意事项

用 Access 中的起始部分在物料清单中查找最终项目的方法是啥?数组?递归函数?

左程云-递归和动态规划

php写函数 根据子类(id)递归查找顶级父类(id) 返回父类名字 (表结构:id name pid)