int maximum(int arr[], int i), Rekursion
-
Hab grad von nem Kollegen eine kleine Aufgabe bekommen (sollte mit Java fürs Studium umgesetzt werden) und hab dafür mal ne kleine Funktion geschrieben die in Java wunderbar funtkioniert aber in C++ ein paar Probleme verursacht.
Hier erst einmal die Aufgabe:
1 - Bestimmung des Maximums
Entwickeln Sie eine rekursive Methode int maximum( int[] arr, int i ), die für ein Feld arr das Maximum im
Bereich von arr[0] bis arr[i] mit 0<=i<arr.length bestimmt und zurückgibt.
Verzichten Sie bei der Lösung der Aufgabe völlig auf die Benutzung von for- oder while-Schleifen!Also einfach nur den größten Wert im Array zwischen 0 und i ausgeben.
Und hier mal meine Funktion:
#include <iostream> int maximum(int arr[], int i) { if(i==0) return arr[0]; return std::max(arr[i], maximum(arr, --i)); } int main() { int arr[] = {1, 6, 3, 7}; std::cout << maximum(arr, 3) << std::endl; //std::cout << arr[4] << std::endl; }Nun gibt er bei der zahl 3 als zweiten Parameter die 6 aus (wo er in Java die 7 ausgibt) und bei maximum(arr, 4) erst die 7 obwohl das eigentlich ja "index out of bounds" ist.
Jemand ne Ahnung wieso bei maximum(arr, 3) 6 und nicht 7 returned wird und wieso man auf arr[4] in der funktion zugreifen kann (und das richtige ergebnis ausgibt xD) während das in der main nicht funktioniert?
-
Nun, dein Aufruf zu std::max ist problematisch.
In C++ ist es undefiniert, in welcher Reihenfolge die Ausdrücke für Funktionsargumente ausgewertet werden, da du i im Argumentausrduck (?) veränderst, führt das zu Problemen.
Für i=3 kann std::max bspw. mit arr[3], maximum(arr, 2) oder arr[2], maximum(arr, 2) aufgerufen werden. Verwende - 1 anstatt -- um das zu beheben.
Dass arr[4] klappt ist reiner Zufall. Es ist nicht definiert und meistens wird dort Speicher gelesen/geschrieben, der dem Programm nicht gehört. Das führt dann zu einem sog. Segmentation Fault (Windows-Fehlermeldung: Dieses Programm funktioniert nicht mehr.) und das Programm crasht (bzw. wird vom OS gekillt).
In deinem Fall steht an der Speicheradresse zufälligerweise eine 7.
-
Jo super danke

Wär ich glaub ich nie drauf gekommen aber nu bin ich ja für die nächsten male gewappnet^^
-
#include <iostream> #include <algorithm> template<typename InputIteratorType> int Maximum(InputIteratorType Begin, std::size_t Length) { if(Length <= 1) { return *Begin; } return std::max(*Begin, Maximum(++Begin, --Length)); } int main() { int arr[] = {1, 6, 3, 7}; std::cout << Maximum(arr, 3) << std::endl; }
-
oh ups fail, vergesst das da oben.