2016-07-14 7 views
-1
#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; 
} 

Ich habe keine Erfahrung mit dem Konzept der rekursiven Funktionen. Dieser Code wurde geschrieben, um das maximale Element eines Arrays zu finden. Ich bekomme jedoch einen Stapelüberlauffehler. Kann es jemand korrigieren? Außerdem weiß ich nicht genau, wo ich die Rekursion einfügen soll.Stapelüberlauffehler von rekursiver Funktion

+1

sollten Sie Ihren Code oben einrücken, damit es einfacher liest. Bei Ihrem Problem bemerken Sie, dass getargest sich selbst mit dem gleichen Array aufruft, das es bekommen hat - nichts ändert sich, so dass die Rekursion keine Chance hat, zu beenden. Sie müssen etwas schieben - Sie können ++ auf den Zeiger tun, ODER Sie können das Array global halten und nur auf dem Index i wiederholen. – dercz

Antwort

1

Sie haben mehrere Probleme, alle von ihnen klein.

Zuerst machen Sie keine Progression durch das Array: Sie rufen immer mit demselben Argument auf, das ist das gesamte Array. Die Strategie der Rekursion besteht darin, etwas Einfaches zu tun und das Problem dann auf etwas Kleineres zu reduzieren, wenn Sie erneut anrufen.

In diesem Fall haben Sie das Konzept Recht: Überprüfen Sie ein Element gegen den größten der Rest der Liste. Sie tun wiederholen, um das Maximum zu finden, aber Sie reduzieren nicht die Liste. Sie funktionieren auch nicht wirklich gut mit der Liste max. Beachten Sie zum Beispiel, dass Sie (bei jedem Aufruf) das Maximum auf die vorherige Ebene zurückstellen ... aber Sie speichern es überhaupt nicht.

Versuchen Sie stattdessen:

  • aus der Liste das erste Element übernehmen;
  • finden Sie das Maximum des Rests;
  • geben Sie den größeren dieser beiden zurück.

Der Code könnte wie folgt aussehen:

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

Hinweis den kleinen C Trick: ++ arr Schritte arr, als Array-Referenz, auf das nächste Element. Möglicherweise haben Sie dies bereits als Zeichenzeiger und Zeichenfolgenvariable gesehen.

1

Nun, es scheint, Sie versuchen, etwas zu tun, das einfacher mit einer Schleife als Rekursion zu tun ist. Sie können getlargest() wie folgt implementieren:

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; 
} 

ich nicht mit dem Konzept der rekursiven Funktionen erfahren bin.

Angenommen, Sie wollen lernen, wie Rekursion zu verwenden, sollten Sie einen Blick auf factorial nehmen. Es ist ein Kinderspiel, die Fakultät einer Ganzzahl i mit einer rekursiven Funktion zu finden.