Frage Rekursiv

damdidu

Grünschnabel
Hallo,

wir sollten ein Programm schreiben, was Zahlen iterativ addiert(siehe code) und genau dies sollen wir nun auch in einer rekursiven funktion machen, allerdings finden wir derzeit einen wirklichen anhaltspunkt wie das rekursiv aussehen könne.... Wäre es ansich einfach nur die forschleife rückwärst?
Code:
#include <stdio.h>
int main(int argc, char *argv[])
{

int n = atoi(argv[1]);
int i;
int sum = 0;
for(i=1;i<=n;i++)
{
sum+=i;
}
printf("%d .\n", sum);
return 0;
}
 
Hi

zum bestehenden Code: Du solltest am Anfang prüfen, ob argv[1] überhaupt exisiert
(per argc. Programm beenden etc. wenns nicht passt)

Und eine Schleife in die andere Richtung ist natürlich keine Rekursion.
Hast du überhaupt schon mal eine gesehen?

Eine Funktion, die sich selbst aufruft, ist das.
 
Bringt nichts, wenn man es nicht versteht.

Was du für ein n ausrechnen willst in der Schleife ist ja, in eher mathematischer Schreibweise
f(n) = 1 + 2 + 3 + ... + (n-1) + n
Eine C-Funktion, die ein n übergeben bekommt und das Ergebnis von f(n) zurückgibt
(ausgerechnet iterativ mit Schleife) solltest du schaffen.
Also nur die Berechnungssachesache aus dem main auslagern.

Der Knackpunkt am Rekursiven:
f(n) = 1 + 2 + 3 + ... + (n-1) + n
ist das Selbe wie
f(n) = n + f(n-1)

Die Summe von 1 bis 8 ist 8 plus der Summe von 1 bis 7
Die Summe von 1 bis 7 ist 7 plus der Summe von 1 bis 6
...

Eine rekursive Variante der C-Funktion würde einfach ihren Parameter n
und den Returnwert von sich selbst mit n-1 aufgerufen addieren und returnen...

Zu beachten dabei ist dann noch, dass die Funktion mit 0 aufgerufen
nicht sich selbst mit -1 aufruft usw., sondern da einfach 0 return´t wird
(bzw., man könnte auch schon bei 1 aufhören. Hier selbes Ergebnis.)
 
Okay danke schon mal für die Erklärung!
Würde es das nun sein?
Code:
int main(int argc,char *argv[])
{
int a=atoi(argv[1]),b;
b=add(a);
printf("%d\n",b);
}
add(int n)
{
if(n==1)
{
return(1);
}
else
{
return(add(n-1)+n);
}
 
Zuletzt bearbeitet:
Du würdest uns beiden einen Gefallen tun, wenn du deine Codes einrückst.

Am Schluss fehlt eine }
Die argc-Sache wird noch nicht geprüft,
Dein add hat keinen return-Typ (int...)
add ist bei der main-Stelle noch nicht bekannt, auch deshalb wird das nicht kompilieren
 
Dein add hat keinen return-Typ (int...)
Der ist bei C dann implizit int und stammt noch aus der Kernighan - Ritchie Zeit (vor der Standardisierung der Sprache).
add ist bei der main-Stelle noch nicht bekannt, auch deshalb wird das nicht kompilieren
Auch wieder OK in C, da dann wieder automatisch int als Parameter- und Rückgabetyp angenommen wird.

Heutzutage sollte man allerdings so eine lapse Schreibweise tunlichst vermeiden. Funktionen sollten deklariert werden - und zwar mit vollständigem Typ - bevor man sie verwendet.
 

Neue Beiträge

Zurück