Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C, suche rekursive Lösung für Funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
28.06.2007, 11:56 Uhr
Linx



Hallo Leute,
habe noch Probleme wie ich eine rekursive Funktion schreibe.
Ich weiss, dass eine rekursive Lösung nicht immer besser ist, ich will es aber nur üben.
Jetzt will ich eine Funktion schreiben, das eine Zahl und eine Ziffer einliest und dann ausgibt wie oft die Ziffer in der Zahl vorkommt.
hier erstmal die iterative Version (die funktioniert!)


C++:
#include <stdio.h>

int ziffer_zaehlen(int zahl, int ziffer){
    int k, zaehler=0;

    while (zahl>=10)
      {
        k=zahl-((zahl/10)*10);
        if (k==ziffer)
            zaehler++;
            zahl=zahl/10;
    }
    if (zahl==ziffer) zaehler++;
    return zaehler;
}

void main(void){
    int zahl, ziffer, ergebnis;
    printf("Bitte eine Zahl eingeben:\n");
    scanf("%d",&zahl);
    printf("Welche Ziffer soll gesucht werden:\n");
    scanf("%d",&ziffer);
    ergebnis=ziffer_zaehlen(zahl,ziffer);
    printf("%d\n",ergebnis);
    return 0;    
}


ich weiss echt nicht, wie man die Funktion jetzt rekursiv schreiben könnte...
kann mir bitte jemand helfen, theoretisch dürfte es nicht schwierig sein oder?
Gibt es irgendwelche Tricks beim umschreiben Iterativ <-> Rekursiv?

Gruß Linx

Dieser Post wurde am 28.06.2007 um 11:58 Uhr von Linx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.06.2007, 19:36 Uhr
~huhu
Gast



C++:
int ziffer_rekursiv(int zahl, int ziffer)
{
    static int zaehler;
    
    if (zahl%10 == ziffer)
        zaehler++;
    
    if (zahl/=10)
        return ziffer_rekursiv(zahl, ziffer);
    
    return zaehler;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.06.2007, 19:15 Uhr
~Linx
Gast


He cool, vielen dank!
das hat mir glaub ich einiges geholfen!
Mensch, hatte ganz vergessen, dass es auch das % Zeichen gibt, ich mein das wäre auch für die iterative Lösung praktisch gewesen... naja, ich bin froh, das ich wieder was dazu gelernt hab!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.06.2007, 19:58 Uhr
Linx



Hab mich grad nochmal damit beschäftigt... was mir nicht ganz klar geworden ist, ist folgende Anweisung:
if (zahl/=10)

Wie genau soll man das verstehen? Das heisst doch in Worten " Wenn zahl gleich ist wie zahl geteilt durch 10" oder??? Der Fall kann doch nicht eintreten?
Kann mir jemand auf die Sprünge helfen?
Sorry für solche Anfängerfragen aber ich habs halt noch ned so drauf...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.06.2007, 20:20 Uhr
0xdeadbeef
Gott
(Operator)



C++:
    static int zaehler;


Das ist schon etwas um die Regeln herumgespielt, und außerdem nicht threadsafe. Und du kannst die Funktion so nur einmal benutzen. Besser:

C++:
int ziffer_rekursiv(int zahl, int ziffer) {
  if(zahl == 0) return 0;
  return (zahl % 10 == ziffer ? 1 : 0) + ziffer_rekursiv(zahl / 10, ziffer);
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 29.06.2007 um 20:21 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.06.2007, 21:18 Uhr
~willy
Gast


Besser :

C++:
int ziffer_rekursiv(int zahl, const int ziffer)
{
  if (zahl == 0 && ziffer == 0) return 1;// Dieser Fall muss beruecksichtigt werden!
  if (zahl == 0) return 0;
  return (zahl % 10 == ziffer ? 1 : 0) + ziffer_rekursiv(zahl / 10, ziffer);
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.06.2007, 22:34 Uhr
0xdeadbeef
Gott
(Operator)


Um...auf die Art kriegst du bei der Eingabe der Zahl 1 zum Beispiel zurück, dass eine Null enthalten wäre.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.06.2007, 00:53 Uhr
KaraHead



@willy
Leg dich nicht mit Beefy an. Nicht umsonst heißt er einfacher halber "Gott"

P.S. Hat zwar nix mit dem Thema zu tun aber ein bisschen Spam ist nie verkehrt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.06.2007, 02:07 Uhr
~huhu
Gast



Zitat von Linx:
Hab mich grad nochmal damit beschäftigt... was mir nicht ganz klar geworden ist, ist folgende Anweisung:
if (zahl/=10)




C++:
int ziffer_rekursiv (int zahl, int ziffer)
{
    if (zahl < 0) zahl = -zahl; // gehört auch in deine iterative Funktion !  
    // Negative Zahl in positive Zahl wandeln
    if (zahl%10 == (ziffer&0xff))
        ziffer += 0x100;
    // In ziffer wird hier auch die Anzahl der Vorkommen zwischengespeichert
    if (zahl/=10) // zahl = zahl/10; (zahl != 0) = true
        return ziffer_rekursiv (zahl, ziffer); // Rekursion
    return ziffer>>8;  
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
30.06.2007, 17:39 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Leg dich nicht mit Beefy an. Nicht umsonst heißt er einfacher halber "Gott"


Ach am Ende kocht der auch nur mit Wasser
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: