簡體   English   中英

遞歸函數的堆棧溢出錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM