递归函数的 C++ 错误

c++ Error From Recursive Function

本文关键字:错误 C++ 递归函数      更新时间:2023-10-16
#include<iostream>
#include<string>
#include<sstream>
#include<conio.h>
#include<vector>
#define MAX 100
using namespace std;
int size;
int getlargest(int arr[ ]){
    static int max = -1000;
    static int i = 0;
    if(i < size){
        if(arr[i] >= max){
            max = arr[i];
            i++;
        }
        getlargest(arr);
    }
    return max; 
}
int main(){
    int res;
    cout << "enter the size please: ";
    cin >> size;
    int arr[MAX];
    for(int i=0;i<size;i++){
        cin >> arr[i];
    }
    res = getlargest(arr);
    cout << res;
    getch();
    return 0;
}

我对递归函数的概念没有经验。 编写此代码是为了查找数组的最大元素。但是,我收到堆栈溢出错误。 谁能纠正它? 另外,我不知道确切的位置插入递归。

你有几个问题,都是小问题。

首先,你

不会在数组中进行任何进展:你总是使用相同的参数进行调用,即整个数组。 递归的策略是做一些简单的事情,然后在再次调用时将问题减少到更小的问题。

在这种情况下,您有正确的概念:将一个元素与列表中其余最大的元素进行检查。 您确实会重复查找最大值,但不会减少列表。 您实际上也不能很好地使用列表max。 例如,请注意(在每次通话中)您将最大值返回到上一个级别......但是你根本不保存它。

试试这个:

  • 从列表中删除第一个元素;
  • 求余数的最大值;
  • 返回这两个中较大的一个。

代码可能如下所示:

if(arr.size() == 1) {
    return arr[0]
else {
    max = getlargest(++arr);
    if (arr[0] >= max)
        max = arr[0]
}
return max;

请注意这里的小 C 技巧:++arr 将 arr 作为数组引用递增到下一个元素。 您可能已经将其视为字符指针字符串变量。

好吧,您似乎正在尝试做一些比递归更容易使用循环做的事情。您可以像这样实现getlargest()

int getlargest(int arr[]) {
    int max = arr[0]; // This is safer than initializing max with 0. What if arr[0] is the largest element and all elements are below 0?
    for (int i = 0; i < size; ++i)
        if (arr[i] > max)
            max = arr[i];
    return max;
}

我对递归函数的概念没有经验。

假设你想学习如何使用递归,你应该看看阶乘。使用递归函数找到整数i的阶乘是不费吹灰之力的。