C++ 递归查找数组的最小值

标签 c++ recursion

我有一个 c++ 编程类的任务,用于编写一个不使用静态变量的递归函数,其原型(prototype)如下: int findmin(const int a[], int n);

我的解决方案有效(适用于非常小的阵列),但我认为 ~2^n 的复杂性过高并且可以改进。

是否可以在指定标准内进行任何改进以提高效率?

int findmin(const int a[], int n)
{
    if(n == 0)
        return a[0];
    else
    {
        if(a[n-1] < findmin(a,(n-1)))
            return a[n-1];
      else
            return findmin(a,(n-1));
    }
}

最佳答案

担心效率有点愚蠢,因为有一种明显的非递归方法可以在 O(n) 中完成它,一次通过。甚至还有一个 STL 算法 std::min_element。但是,这是一个愚蠢的任务。首先确保您的解决方案是正确的。当n==0时,a[0]是否有效?通常,这样的n表示数组的长度,而不是最低索引。

要从 O[n^2] 到 O[n],请务必只比较每个元素一次。这意味着不是每次都从数组的开头开始。

#include <algorithm>
#include <cassert>

int findmin(const int a[], int n)
{
    assert(n>0);
    if(n == 1)  // See heyah.
        return a[0];
    else
    {
        return std::min(a[0], findmin(a + 1, n - 1));
    }
}

在真正的 C++ 代码中,如果由于某种原因我们背负着老式的函数签名,我们会这样做:

int findmin(const int a[], int n) {
    if(n<=0) { throw std::length_error("findmin called on empty array");}
    return *std::min_element(a, a+n);
}

关于C++ 递归查找数组的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50033943/

相关文章:

c++ - 将多个文件编译在一起?

递归协议(protocol)的 Swift 内存管理

java - 如何可视化递归

c++ - 我正在学习 C++,我应该使用最新的编译器版本还是我的大学使用的编译器版本?

c++ - MFC中如何嵌套不同的资源文件?

c++ - QGraphicsScene位置问题

c++ - 如何处理传递给构造函数参数的错误值?

java - 递归序列

algorithm - 递归计算二叉树中的叶子数(算法)

c# - 如何为动态 for 循环级别编码?