[英]Stack Overflow Error From Recursive Function
#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;
}
我对递归函数的概念没有经验。 编写此代码是为了查找数组的最大元素。 但是,我收到堆栈溢出错误。 有人可以纠正吗? 另外,我不知道确切在哪里插入递归。
您有几个问题,都很小。
首先,您不会在数组上进行任何操作:始终使用相同的参数进行调用,即整个数组。 递归的策略是做一些简单的事情,然后在再次调用时将问题减小到较小的程度。
在这种情况下,您拥有正确的概念 :对照列表中其余元素中的最大元素检查一个元素。 您可以重复查找最大值,但不会减少列表。 您实际上也不能很好地使用list 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;
}
我对递归函数的概念没有经验。
假设您想学习如何使用递归,则应该看一下factorial 。 使用递归函数查找整数i
的阶乘是不费吹灰之力的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.