rekursiv zu iterativ?

Diskutiere mit über: rekursiv zu iterativ? im Mac OS X Entwickler, Programmierer Forum

  1. Max02

    Max02 Thread Starter MacUser Mitglied

    Beiträge:
    157
    Zustimmungen:
    0
    Registriert seit:
    08.10.2004
    Hallo Leute,

    ich das Programmstück das ich gestern gepostet hab, einwenig noch verändert. Jetzt möchte ich diese Rekursion aber iterativ ablaufen lassen . Wie mach ich das? Der Compiler schreit bei meinem Source Code:
    Code:
    #include <iostream.h>
    
    
    /*
    	Die rekursive Funktion soll ungerade Ziffern der Matrikelnummer in
    	umgekehrter Reihenfolge in der diese in der Matrikelnummer auftreten ausgeben.
    	Eine ungerade Ziffer darf nicht ausgegeben werden, falls bereits eine größere ungerade Ziffer ausgegeben wurde.
    */
    
    /*void f_rek(int matrnr, int max_zif) {
    
    int matr=matrnr%10;
    	
    	if(matrnr!=0) {
    		if(matrnr%2) {
    			if(matr > max_zif) {
    				max_zif=matr;
    				cout<<matr;
    			}
    		}
    		f_rek(matrnr/10, max_zif);
    	}
    }*/
    
    int main () {
    	f_rek(102820,0);
    	return 0;
    }
    
    
    void f_rek(int matrnr, int max_zif) {
    
    int matr = matrnr%10;
    
    	while(matrnr) {
    		if(matrnr%2 && matr>max_zif) {
    			cout<<matr;
    		} else return;
    		matrnr/=10;
    		matr=matrnr%10;
    		max_zif=matr;
    	}
    }
    
     
  2. CapFuture

    CapFuture MacUser Mitglied

    Beiträge:
    1.777
    Zustimmungen:
    1
    Registriert seit:
    23.01.2004
    Muss ehrlich sein, dass ich die Aufgabe des Programms nicht verstehe...

    Kannst du ein konkretes Bsp geben, damit man sich mehr darunter vorstellen kann?

    BTW würde ich statt der If Schachtlung eher log. Operatoren wie AND verwenden, macht den Code lessbarer...
     
  3. Max02

    Max02 Thread Starter MacUser Mitglied

    Beiträge:
    157
    Zustimmungen:
    0
    Registriert seit:
    08.10.2004
    Wenn du den Source Code im Kommentar (als das erste Code Fragment) compilierst,
    dann glaub ich erkennst du die Aufgabenstellung.

    Für alle Fälle:
    [20 Punkte] Erstellen Sie eine Definition der rekursiven Funktion void f rek(int matrnr,int min zif );: Als erster Parameter wird Ihre Matrikelnummer ?ubergeben. Die Wertbelegung des zweiten Parameters ist von Ihnen zu bewerkstelligen. Die rekursive Funktion soll gerade Ziffern der Matrikelnummer in der gleichen Reihenfolge ausgeben (mittels cout innerhalb der Funktion), in der diese in der Matrikelnummer auftreten. Eine gerade Ziffer darf nicht ausgegeben werden, falls die Matrikelnummer in irgendeiner weiter rechts liegenden Stelle noch eine kleinere ebenfalls gerade Ziffer enth?alt. z.B. 45876 ? Ausgabe w?are: 46, da die Ausgabe von 8 unterdr?uckt wird. Eine Verwendung von Schleifen innerhalb der Funktion ist nicht erlaubt.
     
    Zuletzt bearbeitet: 14.04.2005
  4. der_Kay

    der_Kay MacUser Mitglied

    Beiträge:
    1.693
    Zustimmungen:
    7
    Registriert seit:
    02.09.2004
    a) Was meinst Du mit "iterativer" Rekursion?

    b) Bist Du sicher, daß Du die Aufgabenstellung richtig abgeschrieben hast? Nirgendwo eine Referenz oder ein Rückgabewert für f_rek?

    c) Ich les da was von "while" - Schleifen sind doch verboten...
     
  5. Max02

    Max02 Thread Starter MacUser Mitglied

    Beiträge:
    157
    Zustimmungen:
    0
    Registriert seit:
    08.10.2004
    die aufgabensstellung bezieht sich auf die rekursion. die hab ich ja schon geschrieben:
    Code:
    /*void f_rek(int matrnr, int max_zif) {
    int matr=matrnr%10;
    if(matrnr!=0) {
    if(matrnr%2) {
    if(matr > max_zif) {
    max_zif=matr;
    cout<<matr;
    }
    }
    f_rek(matrnr/10, max_zif);
    }
    }*/
    int main () {
    f_rek(102820,0);
    return 0;
    und funktioniert auch. die zweite aufgabenstellung lautet: eine Funktion zu erstellen, die das selbe Ergebnis wie die Rekursion berechnet und retourniert und zwar iterativ, also ohne rekursiven aufruf
     
  6. CapFuture

    CapFuture MacUser Mitglied

    Beiträge:
    1.777
    Zustimmungen:
    1
    Registriert seit:
    23.01.2004
    Spontan würd ich die Zahl in nen String umwandeln. Da das ganze in C als Char[] aufgebaut ist, kann man leicht auf die einzelnen Zeichen mit ner Schleife zugreifen und sich so einen neuen String zusammenbasteln...
     
  7. der_Kay

    der_Kay MacUser Mitglied

    Beiträge:
    1.693
    Zustimmungen:
    7
    Registriert seit:
    02.09.2004
    Code:
    void  iterate ( int n )
    {
    	int max = 0;
    	while ( n > 0 )
    	{
    		int ziff = n % 10;
    		if ( ziff % 2 && ziff > max )
    		{
    			std::cout << ziff ;
    			max = ziff;
    		}
    		n /= 10;
    	}
    }
    
    p.s.:
    - Deine "heutige" (rekursive) Aufgabenstellung arbeitet aber mit geraden Zahlen...vielleicht die vom Sitznachbarn?

    - Wenn man die Aufgabenstellung genau liest: Vielleicht ">=" anstatt ">" im if-Statement ?
     
    Zuletzt bearbeitet: 14.04.2005
  8. Max02

    Max02 Thread Starter MacUser Mitglied

    Beiträge:
    157
    Zustimmungen:
    0
    Registriert seit:
    08.10.2004
    ja danke für den source code,...

    Deine "heutige" (rekursive) Aufgabenstellung arbeitet aber mit geraden Zahlen...vielleicht die vom Sitznachbarn?
    hmm, wieso matr mod 2 schaut doch nach ungeraden zahlen
     
  9. der_Kay

    der_Kay MacUser Mitglied

    Beiträge:
    1.693
    Zustimmungen:
    7
    Registriert seit:
    02.09.2004
    Gemeint war nicht Dein Code, sondern Dein Post (hier: #3), den Du zur Vollständigkeit nochmal "wiederholt" hast. Das ist eine andere Aufgabe, als die, die Du rekursiv gelöst hast.
    hast.

    Aber ist vielleicht nicht so wichtig...

    Gruß,

    Kay
     
Die Seite wird geladen...
Ähnliche Themen - rekursiv iterativ Forum Datum
Perl-Skript rekursiv anwenden Mac OS X Entwickler, Programmierer 19.04.2007

Diese Seite empfehlen