Erstes Programm: Zahl potenzieren



  • Ansonsten koenntest Du es auch recursive machen (spart die Schleife) - nur fuer Exponenten >= 0:

    double Pot (double rBase, int  iExpo)
    {
        if (iExpo == 0)
            return 1;
        else 
            return Pot (rBase, iExpo - 1) * rBase;
    }
    


  • hartmut1164 schrieb:

    (spart die Schleife)

    'spart' ist irgendwie unpassend, findeste nicht?
    🙂



  • hartmut1164 schrieb:

    Ansonsten koenntest Du es auch recursive machen

    lern doch bitte mal die schreibweise "rekursiv".



  • +fricky schrieb:

    hartmut1164 schrieb:

    (spart die Schleife)

    'spart' ist irgendwie unpassend, findeste nicht?
    🙂

    Naja - Ich konnte es halt nicht lassen ... 🤡



  • Jetzt noch die Zwischenergebnisse in einer Liste ablegen und dann ist es hartmut-style 🤡



  • Tim schrieb:

    ....ist es hartmut-style

    rate mal was hartmut programmieren würde, wenn er rauskriegen will, ob eine zahl gerade oder ungerade ist...
    🙂



  • Zahl % 2
    

    ?

    ^^



  • Skalli schrieb:

    Zahl % 2
    

    ?

    niemals, das hat weder verkettete listen noch rekursion drin.
    🙂



  • bool IsEven(int iNumber) {
       if (iNumber == 0)
         return true;
       else if (IsOdd(iNumber - 1))
         return true;
       else
         return false; 
    }
    
    bool IsOdd(int iNumber) {
      if (IsEven(iNumber - 1))
        return true;
      else
        return false;
    }
    
    double Pot(double rBase, int iExpo) {
      if (iExpo == 0)
        return 1;
      else if (IsEven(iExpo)) {
        int Temp = Pot(rBase, iExpo/2);
        return Temp * Temp;
      }
      else
        return rBase * Pot(rBase, iExpo - 1);
    }
    

    Optimierte Version, spart außerdem den Modulo-Operator.



  • bool IsEven(int iNumber) {
       if (iNumber == 0)
         return true;
       else if (IsOdd(iNumber - 1))
         return true;
       else
         return false; 
    }
    
    bool IsOdd(int iNumber) {
      if (IsEven(iNumber - 1))
        return true;
      else
        return false;
    }
    
    double Mul(double rBase, int iExpo) {
      if (iExpo == 0)
        return 0;
      else if (IsEven(iExpo)) {
        int Temp = Mul(rBase, iExpo/2);
        return Temp + Temp;
      }
      else
        return rBase + Mul(rBase, iExpo - 1);
    }
    
    double Pot(double rBase, int iExpo) {
      if (iExpo == 0)
        return 1;
      else if (IsEven(iExpo)) {
        int Temp = Pot(rBase, iExpo/2);
        return Mul(Temp,Temp);
      }
      else
        return Mul(rBase,Pot(rBase, iExpo - 1));
    }
    

    doppeloptimierte version, spart außerdem die multiplikation, geht aber nur noch mit natürlichen zahlen.
    (dieses Pot mit Mul habe ich übrigens sogar mal benutzt.)



  • int div2(int a,int b=0){
      if(a<=b)
        return a;
      else
        return div2(a-1,b+1);
    }
    


  • 😃



  • Da will ich mich nicht luppen lassen, schliesslich kann

    n mod m
    

    sich auch so vorstellen, das Ergebnis die Speichennummer eines Rades vom m Speichen ist, dass um n Speichen weitergedreht wurde. Man muss also nur einen Ring bauen, der geschlossen ist und m Elemente enthaelt, diesen laesst man n-mal schrittweise weiterlaufen und erhaelt so den mod-Wert. Dann muss man den Ring noch aufbrechen und kann ihn ueber ein Rekursion aufraeumen - also etwa so:

    struct SingleSpoke
    {
        int                    iSpokeNo;
        struct SingleSpoke    *pNeighbour;
    }
    
    struct SingleSpoke *CreateSpokes (struct SingleSpoke *pLast,
                                      int                 iCurrent,
                                      int                 iM)
    {
        struct SingleSpokes *pTemp;
    
        if (iCurrent != iM)
        {
            pTemp = malloc (sizeof (SingleSpoke));
    
            pTemp->iSpokeNo   = iCurrent;
            pTemp->pNeighbour = pLast;
    
            return CreateSpokes (pTemp, iCurrent + 1, iM)
        }
        else
            return pLast;
    }
    
    struct SingleSpokes *GetFirst (struct SingleSpokes *pIn)
    {
        if (pIn->pNeighbour == NULL)
            return pIn;
        else
            return GetFirst (pIn->pNeighbour);
    }
    
    struct SingleSpokes *BuildWheel (iM)
    {
        struct SingleSpokes *pReturn,
                            *pLast;
    
        pLast = CreateSpokes (NULL, 0, iM);
    
        pReturn = GetFirst (pLast);
    
        pReturn->pNeighbour = pLast;
    
        return pReturn;
    }
    
    int RunWheel (int                   iN,
                  struct SingleSpokes  *pWheel)
    {
        if (iN == NULL)
            return pWheel->iSpokeNo;
        else
            return RunWheel (iN - 1, pWheel->pNeighbour);
    }
    
    struct SingleSpoke *BreakWheel (struct SingleSpoke *pWheel)
    {
        struct SingleSpoke *pReturn;
    
        pReturn = pWheel->pNeighbour;
    
        pWheel->pNeighbour = NULL;
    
        pReturn;
    }
    
    void DestroyWheel (struct SingleSpoke *pWheel)
    {
        struct SingleSpoke *pNeighbour;
    
        if (pWheel != NULL)
        {
            pNeighbour = pWheel->pNeighbour;
            free (pWheel);
            DestroyWheel (pNeighbour);
        }
    }
    
    int Mod (int    iN,
             int    iM)
    {
        struct SingleSpoke    *pWheel;
        int                    iResult;
    
        pWheel = BuildWheel (iM);
    
        iResult = RunWheel (iN, pWheel);
    
        DestroyWheel (BreakWheel (pWheel));
    
        return iResult;
    }
    


  • und das wiederum erinnert mich an

    MOD
    PUSHZERO result        >
    DUP1 count             <[->>+>+<<<]>>>[-<<<+>>>]<
    DEC count              -
    // divisor=5 dividend=2 result=0 (count=2) tmp
    go divisor             <<<
    WHILE divisor          [
     go count               >>>
     DUP0 tmp               [->+>+<<]>>[-<<+>>]<
     NOT tmp                >+<[[-]>-<]>[-<+>]<
     IF tmp                 [[-]
      go result              <<
      INC result             +
      DUP2 count             <[->>+>+<<<]>>>[-<<<+>>>]<
      go tmp                 >
     ENDIF tmp              ]
     go count               <
     DEC count              -
     go divisor             <<<
     DEC divisor            -
    ENDWHILE divisor       ]
    // (divisor=0) dividend result=? count=?
    go count               >>>
    sub from dividend      [-<<->>]
    POP0 count             <
    POP result             [-]<
    DEC dividend           -
    ADD                    [-<+>]<
    


  • Nun, in Brainfuck schreibe ich noch nicht, aber wer weiss ...



  • Bashar schrieb:

    bool IsEven(int iNumber) {
       if (iNumber == 0)
         return true;
       else if (IsOdd(iNumber - 1))
         return true;
       else
         return false; 
    }
    
    bool IsOdd(int iNumber) {
      if (IsEven(iNumber - 1))
        return true;
      else
        return false;
    }
    

    so ungefähr wollt ich das sehen
    http://en.wikipedia.org/wiki/Mutual_recursion
    🙂


Anmelden zum Antworten