2016-07-14 15 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; 
} 

私は再帰関数の概念に慣れていません。このコードは、配列の最大要素を見つけるために書かれています。ただし、スタックオーバーフローエラーが発生しています。誰でもそれを修正できますか?また、再帰を挿入する場所を正確にはわかりません。再帰関数からのスタックオーバーフローエラー

+1

上記のコードは、読みやすいようにインデントする必要があります。あなたの問題として、getlargestがそれと同じ配列を持って自分自身を呼び出すのを確認します。何も変わらないので、再帰は終了する機会がありません。あなたは何かを押す必要があります - あなたはポインターで++を行うことができます。あるいは、配列をグローバルに保ち、インデックスiだけを繰り返すことができます。 – dercz

答えて

1

あなたにはいくつかの問題があります。

まず、配列全体には何も進んでいません。常に配列全体と同じ引数を使用して呼び出します。再帰の戦略は、何か簡単なことをしてから、再度呼び出すときに問題を小さくすることです。

この場合、のコンセプトはです。残りのリストのうち最大のものに対して1つの要素をチェックしてください。最大値を見つけるにはに再発させますが、リストは縮小しません。また、実際にはリストmaxとはうまく機能しません。たとえば、(各呼び出しで)最大レベルを前のレベルに戻していますが、それはまったく保存しないことに注意してください。

は、代わりにこれを試してみてください:

  • は、リストから最初の要素を取ります。
  • 剰余の最大値を求める。
  • これらの2つのうち大きい方を返します。

コードは次のようになります。次の要素に、配列参照として++ ARR増分ARR

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

注ここで少しCトリック。これは既に文字ポインタの文字列として見てきたかもしれません。

1

さて、再帰よりもループで簡単なことをしようとしているようです。私は再帰関数の概念を持つ経験豊富ではないよ

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

:あなたはこのようgetlargest()を実装することができます。

再帰の使用方法を知りたい場合は、factorialを参照してください。再帰関数を使用して整数の階乗を見つけるのは簡単ではありません。i