Rekursion



  • Hi! Ich brauch schon wieder eure Hilfe, komme irgendwie nicht weiter. also:
    ich habe folgende Funktion:

    string ziffern (unsigned int x) {
    string res = „“;
    while (x > 0) {
    res = char (‘0’ + (x – (x / 10) * 10) + res;
    x = x / 10 ;
    }
    return res ;
    }

    1. Wie kann ich die Funktion Ziffern rekursiv definieren?
    2. Die rekursive Definition von ziffern basiert auf einer passenden Auffassung der ntürlichen Zahlen als rekursiver Menge. Wie sieht diese aus: was ist die Basis und wie werden natürliche Zahlen konstruiert, die nicht zu dieser Basis gehören?

    freue mich über jede Antwort.
    Gruß
    v.



  • string ziffern (unsigned int x) {
    string res = '';
    while (x > 0) {
    res = char ('0' + x%10) + res;
    x = x / 10 ;
    }
    return res ;
    }
    

    In deinem Code fehlt nicht nur eine Klammer, du hast schon wieder die
    gleiche seltsame Umschreibung für Modulo gewählt wie schon im letzten Thread.

    Warum???

    [ Dieser Beitrag wurde am 09.07.2003 um 19:28 Uhr von Taurin editiert. ]



  • Könntest du dein Problem mal näher erkäutern.
    Ich kenne eine Menge der natürl. Zahlen die abzählbar unendl. ist.
    Ausserdem gibts primitv-rekursive Funktionen.

    Bsp. für rek. Fkt:

    int qsum(int a) {
      if(z!=0)
         int b = b%10;
         return b+qsum(zahl/10);
      else
         return 0:
    }
    

    was soll dein funkt. machen?

    [ Dieser Beitrag wurde am 09.07.2003 um 19:39 Uhr von grenouille editiert. ]



  • also was das mit den natuerlichen zahlen da soll ist mir nicht wirklich klar.
    jede natuerliche zahl ist entweder 0 oder ihr vorgaenger+1.

    #include<string>
    #include<iostream>
    using namespace std;
    
    string ziffern(unsigned int x) {
        //attention, in parameter is changed
        string res;
        do{ 
            res.insert(res.begin(), '0'+x%10);
            x /= 10 ;
        }while(x);
    
        return res ;
    }
    
    //transition to recursion:
    //local variables must become reference parameters (make a wrapper with the old signature)
    //each time the loop body was executed the recursive function is called
    //the body of the recursion function is the loop body, when the loop 'jumps back', the function calls itself
    //the loop end condition becomes the recursion end condition
    
    ziffernRecurse(unsigned int x, string&res){
        //attention, in parameter is changed
        res.insert(res.begin(), '0'+x%10);
        x/=10;
        if(x){ ziffernRecurse(x,res); }
    }
    
    string rziffern(unsigned int x){
        string res;
        ziffernRecurse(x,res);
        return res;
    }
    
    int main(){
        int x=0;
    
        cout<<x<<":"<<ziffern(x)<<":"<<rziffern(x)<<endl;
        x=1;
        cout<<x<<":"<<ziffern(x)<<":"<<rziffern(x)<<endl;
        x=10;
        cout<<x<<":"<<ziffern(x)<<":"<<rziffern(x)<<endl;
        x=11;
        cout<<x<<":"<<ziffern(x)<<":"<<rziffern(x)<<endl;
        x=123456789;
        cout<<x<<":"<<ziffern(x)<<":"<<rziffern(x)<<endl;
    
        return 0;
    }
    


  • Hm, meine obige Funktion liefert einen leerstring zurück, wenn x==0 ist. ich frage mich ob das so gewünscht ist. wenn ich eure tipps verstanden habe, müsste doch folgende lösung richtig sein, oder?

    C++:

    string ziffern(unsigned x)
    {
    string res;
    if (x>10) res = ziffern(res/10);
    res += char('0'+x%10);
    }

    Taurin:
    -sorry für diese programmierweise, aber ich muss mich leider dem unterricht unterordnen!



  • du legst aber eine menge neue strings an.
    ich glaube meine variante ist dichter an der schleife.
    und wenn du dir meins ansiehst, siehst du, dass 0 "0" liefert.
    du musst erst x%10 in den string schreiben, dann x/=10 auf 0 testen.
    sowas nennt man kopfgesteuert vs fussgesteurte schleifen. letztere werden mindestens einmal ausgefuehrt.

    [ Dieser Beitrag wurde am 09.07.2003 um 21:05 Uhr von PeterTheMaster editiert. ]



  • res/10 ???

    der op/ ist für std::string nicht definiert...



  • virtuel: warum kompilierst und testest du nicht, bevor du fragst, ob etwas richtig ist?



  • Rekursiv:

    #include<string>
    #include<iostream>
    using namespace std;
    
       int ziffern(unsigned int x) {
        //attention, in parameter is changed
       int res;
       if (x != 0) {
            res = x%10;
            return res + 10*ziffern(x / 10) ;
       }
       else
    
        return 0 ;
       }
    
    int main(){
        int x=0;
    
        cout<<x<<":"<<ziffern(x)<<endl;
        x=1;
        cout<<x<<":"<<ziffern(x)<<endl;
        x=10;
        cout<<x<<":"<<ziffern(x)<<endl;
        x=11;
        cout<<x<<":"<<ziffern(x)<<endl;
        x=123456789;
        cout<<x<<":"<<ziffern(x)<<endl;
    
        return 0;
    }
    

    [ Dieser Beitrag wurde am 09.07.2003 um 21:30 Uhr von grenouille editiert. ]



  • was soll das res?
    und du aenderst x nicht.
    und falls du es nicht gemerkt hast: er soll eine funktion schreiben, die eine zahl in einen string umwandelt.



  • 1. Wie kann ich die Funktion Ziffern rekursiv definieren?
    2. Die rekursive Definition von ziffern basiert auf einer passenden Auffassung der ntürlichen Zahlen als rekursiver Menge. Wie sieht diese aus: was ist die Basis und wie werden natürliche Zahlen konstruiert, die nicht zu dieser Basis gehören?

    Wer lesen kann ist klar im Vorteil.
    Und wenn du keine Ahnung von Rekursion hast, würde ich an deiner Stelle lieber ruhig sein.


Anmelden zum Antworten