rekursiv zu iterativ?

M

Max02

Aktives Mitglied
Thread Starter
Dabei seit
08.10.2004
Beiträge
158
Reaktionspunkte
0
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;
	}
}
 
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...
 
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:
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...
 
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
 
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...
 
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:
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
 
Max02 schrieb:
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

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
 
Zurück
Oben Unten