String umgekehrt ausgeben



  • Hallo,

    ich lerne gerade die Rekursione und habe folgendes Bsp gesehen:

    char c[80];
    void ausgabe(int n)
    {
         if (c[n] != '\0')
         {
                  ausgabe(n+1);
                  cout << c[n];
          }
    }
    

    wäre jemand so nett und mir diese Rekursion erklären(ich habe ein main erstellt und als ausgabe bekomme ich den eingegebenen String umgekehrt, aber verstehe nicht wieso 😞 )

    danke



  • ich auch nicht *g*. sollte er den string nicht richtig rum ausgeben? was übergibst du als "n" an "ausgabe"?



  • cin schrieb:

    ich auch nicht *g*. sollte er den string nicht richtig rum ausgeben? was übergibst du als "n" an "ausgabe"?

    als n übergebe ich 0

    z.B in

    main ()
    {
     cin >> c;
    
    ausgabe(0)
    
    }
    


  • Auf deutsch: Wenn das aktuelle Zeichen nicht das letzte ist, gibt zuerst den Nachfolger, dann das aktuelle Zeichen aus.
    Oder anders:
    Bevor Du das aktuelle Zeichen ausgibst (wenn nicht am Ende), gib den Nachfolger aus, d.h. vor jedem Zeichen steht der Nachfolger.



  • ok ich war blind 🙄



  • tntnet schrieb:

    Auf deutsch: Wenn das aktuelle Zeichen nicht das letzte ist, gibt zuerst den Nachfolger, dann das aktuelle Zeichen aus.
    Oder anders:
    Bevor Du das aktuelle Zeichen ausgibst (wenn nicht am Ende), gib den Nachfolger aus, d.h. vor jedem Zeichen steht der Nachfolger.

    🙂 danke



  • Also irgendwie kapier ich das nicht...

    char c[80];
    void ausgabe(int n)
    {
         if (c[n] != '\0')
         {
                  ausgabe(n+1);  // hier springt er wieder in die Funktion "ausgabe
                  cout << c[n];  // und d.h. ja, dass das hier nie erreicht wird
         }  // ist die Bedingung false, wird du Funktion beendet, cout aber trotzdem
            // nie erreicht
    }
    

    Irgendwie...komisch. Trotzdem klappts ja auch bei mir -.- 😕



  • char c[80];
    void ausgabe(int n)
    {
         if (c[n] != '\0')
         {
                  ausgabe(n+1);  // wenn hier die Funktion fdkguhjhj aufgerufen würde
                  cout << c[n];  // würde man dann hier nie hinkommen?
         }
    
    }
    

    Jockel



  • arbeite dir mal in Gedanken durch, was in der Funktion passiert:

    c="TEST";
    ausgabe(0):
      if(c[0]!='\0')->true (c[0]='T')
        ausgabe(1):
          if(c[1]!='\0')->true (c[1]='E')
            ausgabe(2):
              if(c[2]!='\0')->true (c[2]='S')
                ausgabe(3):
                  if(c[3]!='\0')->true (c[3]='T')
                    ausgabe(4):
                      if(c[4]!='\0')->false (c[4]=0 - Stringende)
                      return
                    cout<<c[3];-> Ausgabe "T"
                  endif
                  return
                cout<<c[2];-> Ausgabe "S"
              endif
              return
            cout<<c[1];->Ausgabe "E"
          endif
          return
        cout<<c[0];->Ausgabe "T"
      endif
      return
    ->Weiter im Programm
    

    Du mußt dabei bedenken, daß die Funktion sich selbst rekursiv aufruft, d.h. wenn der Aufruf von ausgabe(n+1); beendet ist, macht sie dahinter weiter mit dem cout<<...



  • Ach soo stimmt! Ausgeklügeltes System^^



  • Noch etwas - globale Variablen solltest du vermeiden, besser wäre diese Version:

    void rev_aus(const char* what);
    {
      if(*what!='\0')
      {
        rev_aus(what+1);
        cout<<*what;
      }
    }
    

Anmelden zum Antworten