Problem mit Speicherallokierung in rekursiver Funktion

  • geschlossen
  • C

  • Chais
  • 925 Aufrufe 3 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit Speicherallokierung in rekursiver Funktion

    Hi
    also ich soll im Zuge eine Programmierpraktikums für die Uni ein prog schreiben, das eine Zahlenfolge ausgibt.
    Dabei sind die ersten beiden Zahlen vorgegebenermaßen 1 und 1
    Die nächste Zahl erhält man nun, indem man die beiden letzten Zahlen nimmt, ihren Wert von der noch leeren Stelle rückwärts zählt, und die dort stehenden Zahlen addiert.
    Also:
    1 1 x
    zweimal 1 rückwärts ergibt jeweils 1, 1+1=2 also x=2
    1 1 2 x
    einmal 2 und einemal 1 rückwärts ergibt 1 und 2, zusammen 3
    1 1 2 3
    und so weiter.

    Iterativ hab ich die aufgabe bereits gelöst. Das Problem is nu dass ich die Aufgabe jetzt rekursiv lösen muss.
    Dabei hab ich Probleme mit dem Speicher, da ich ja einen Array anlegen muss, aber die erforderliche Größe bis zum Start der Funktion nicht bekannt ist. Außerdem habe ich keinen Zugriff auf die verwendete main() nur auf die Subfunktion.
    malloc is schon klar. Das Problem is, ich will den Speicher ja nur beim ersten durchlaufen der Funktion allokieren. Aber sobald ich malloc in eine if-Schleife packe beendet die von mir geschriebene main() schon nach dem einlesen von n. Also der Variablen, die die größe des Arrays angibt.

    C-Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. int *reihe,x=2;
    4. int qRekursiv(int n)
    5. {
    6. if (x==2){
    7. reihe=malloc(sizeof(*reihe)*n);
    8. if (reihe==NULL){
    9. return 0; //Rückgabe im Fehlerfall
    10. }
    11. reihe[0]=1;
    12. reihe[1]=1;
    13. }
    14. reihe[x]=reihe[x-reihe[x-1]]+reihe[x-reihe[x-2]]; //Berechnung der aktuellen Zahl
    15. printf("%4i", reihe[x]); //Trace zum beobachten der Berechnung
    16. if (x==n-1){
    17. return reihe[x]; //Rückgabe des gewünschen Ergebnisses
    18. }
    19. x++; //Weiter zählen
    20. qRekursiv(n);
    21. }
    22. int main()
    23. {
    24. int n,q;
    25. printf("Geben sie ein n ein: ");
    26. scanf("%i", &n); //Einlesen der Größe
    27. q=qRekursiv(n);
    28. if (q==0){ //Reaktion auf Speichermangel
    29. printf("Der Speicher reicht nicht aus, um eine so grosse Zahl zu berechnen.");
    30. return 1;
    31. }
    32. printf("\nDie %i-te Q-Zahl lautet: %i", n, q);
    33. return 0;
    34. }
    Alles anzeigen

    Speziell bei diesem Beispiel wird die Berechnung zwar durchgeführt und ist auch richtig, aber der Rückgabewert ist trotzedem 0... warum auch immer...
    Wenn ich malloc nicht in die if-Schleifen packe, wird natürlich bei jedem Durchlauf der Speicher neu allokiert und mein Ergbnis lautet 0.
    Momentan habe ich also die Wahl zwischen: Array bei jedem Durchlauf löschen, Funktion garnicht erst starten und korrekt Rechnen aber fälschlicherweise 0 bekommen oO...
    Hoffe ihr könnt mir helfen. Ich hab nicht den blassesten Schimmer was ich noch versuchen könnte.

    greetz Chais

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Chais ()

  • Probiers mal mit "return qRekursiv(n);" anstatt nur "qRekursiv(n);". ;)
    Denn mit qRekursiv(n) rufst du ja nur eine Funktion auf, die evtl. etwas zurueck gibt. Aber dadurch gibst du ja selber in dem Moment nix zurueck.

    Chais schrieb:

    Wenn ich malloc nicht in d[en] if-[Block] packe, wird natürlich bei jedem Durchlauf der Speicher neu allokiert

    Noe, dafuer steht ja "if (x == 2)" da und im naechsten Durchgang ist x ja eins mehr.


    Allerdings funzt es natuerlich nicht fuer n = 1 und n = 2.
    Und dann waers denk ich mal natuerlich noch gut, wenn man die Funktion mehr als ein Mal verwenden koennte. ^^

    C-Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. int qRekursiv(int n) {
    4. int *reihe;
    5. int result;
    6. reihe=malloc(sizeof(int)*n);
    7. if (reihe==NULL){
    8. return 0; //Rückgabe im Fehlerfall
    9. }
    10. reihe[0]=1;
    11. reihe[1]=1;
    12. result = qIntern(n,1,reihe);
    13. free(reihe);
    14. return result;
    15. }
    16. int qIntern(int n, int x, int* reihe) {
    17. if (x == n) {
    18. return reihe[n-1]; //Rückgabe des gewünschen Ergebnisses
    19. }
    20. x++; //Weiter zählen
    21. reihe[x] = reihe[x-reihe[x-1]] + reihe[x-reihe[x-2]]; //Berechnung der aktuellen Zahl
    22. return qIntern(n,x,reihe);
    23. }
    24. int main() {
    25. int n,q;
    26. printf("Geben sie ein n ein: ");
    27. scanf("%i", &n); //Einlesen der Größe
    28. q=qRekursiv(n);
    29. if (q==0){ //Reaktion auf Speichermangel
    30. printf("Der Speicher reicht nicht aus, um eine so grosse Zahl zu berechnen.");
    31. return 1;
    32. }
    33. printf("\nDie %i-te Q-Zahl lautet: %i", n, q);
    34. return 0;
    35. }
    Alles anzeigen
    Wo ist der Discord Server

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Skyte ()

  • hrhr
    ja den einfall die allokierung vin qRekursiv machen zu lassen und die eigentliche Berechnung in ne weitere Funktion zu packen hatte ich auch schon. aber dann meckert mich die Prüfumgebung an, dass ich qRekursiv rekursiv implementieren soll. und da ich keinen zugriff auf die main() habe, kann ich auch nix an den Parametern ändern, die qRekursiv übergeben werden. Auch die Allokierung kann ich nich auslagern.
    Wie gesagt, momentan rechnet die Funktion richtig, gibt aber aus irgend einem Grund 0 zurück. Hab auch schon versucht, ob ich einfach ne for-Schleife einbaue, und die bei jedem Durchlauf eins weiter zählen lasse. Hat aber aer nich geklappt.
    Aber ich danke dr für deine Hilfe Skyte :D

    greetz Chais
  • Ok, ist eigentlich logisch, du brauchst das hier:

    C-Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. int qRekursiv(int n) {
    4. if (n == 1 || n == 2) return 1;
    5. return qRekursiv(n-qRekursiv(n-1)) + qRekursiv(n-qRekursiv(n-2));
    6. }
    7. int main() {
    8. int n,q;
    9. printf("Geben sie ein n ein: ");
    10. scanf("%i", &n); //Einlesen der Größe
    11. q=qRekursiv(n);
    12. if (q==0){ //Reaktion auf Speichermangel
    13. printf("Der Speicher reicht nicht aus, um eine so grosse Zahl zu berechnen.");
    14. return 1;
    15. }
    16. printf("\nDie %i-te Q-Zahl lautet: %i", n, q);
    17. return 0;
    18. }
    Alles anzeigen
    Wo ist der Discord Server

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Skyte ()