Return ??



  • Hallo habe ein Problem mit folgendem Code(habe erst angefangen C zu lernen vor ca. 2 wochen^^)

    /* fakul.c */
    #include <stdio.h>
    #include <stdlib.h>
    
    long fakul(long n)
    {
        if(n)
           return n * fakul(n-1);
        return 1;                       [e]larr[/e]
    }
    
    int main(void)
    {
        printf("Fakultät von 5 = %ld\n", fakul(5));
        printf("Fakultät von 9 = %ld\n", fakul(9));
        return EXIT_SUCCESS;
    }
    

    So oben beim Pfeil da wo "return 1;" steht,was bedeutet diese 1?Ich komm nicht drauf, verändere ich die Zahl auf 2 verdoppelt sich das Ergebnis bei 3 verdreifacht usw. kann mir jemand helfen dies zu verstehen?



  • Die 1 steht für die Zahl 1. Wenn du 2 hinschreibst, dann ist das so, als hättest du 2 hingeschrieben. Wenn dir die Antwort jetzt blöd vorkommt, liegt das daran, dass ich versucht habe, die Frage ernstzunehmen.



  • 1 ist der Rückgabewert, was auch sonst?

    Jede Rekursion muss ein Abbruchkriterium haben damit der Stack nicht überläuft.

    Wenn n == 0 ist schlägt Die Bedingung der if-Abfrage fehl und es wird 1 zurückgegeben.
    Andernfalls springt die Funktion schon vorher zurück und return 1 wird nicht erreicht.

    Vielleicht ist es so klarer:

    if(n==0)
     return 1;
    else
     return n * fakul(n-1);
    


  • @Bashar: Hahahahaha ich alch mich tot -.-"
    Tut mir leid das ich nach 2 Wochen noch kein professor in c bin.

    @134234235dsterdg:
    Danke fürs erklären so nur ncoh ne kleine Frage und zwar:
    Woher weis das Programm das es nicht mal null nehmen darf?
    Weil in der Funktion wird ja so zusagen gesagt es soll jetzt 5*4*3*2*1 gerehcnet werden aber ja nicht *0.
    danke shconmal 😉



  • GhostfaceChilla schrieb:

    @Bashar: Hahahahaha ich alch mich tot -.-"
    Tut mir leid das ich nach 2 Wochen noch kein professor in c bin.

    Blöd gesagt: Vielleicht solltest Du Dir ein etwas einfacher gestricktes Programm zum Einstieg aussuchen, dessen Sinn & Zweck Du leichter durchschaust.

    Der Zusammenhang

    GhostfaceChilla schrieb:

    verändere ich die Zahl auf 2 verdoppelt sich das Ergebnis bei 3 verdreifacht usw.

    ist für mein Befinden schon etwas offensichtlicher, als notwendig...



  • GhostfaceChilla schrieb:

    @Bashar: Hahahahaha ich alch mich tot -.-"
    Tut mir leid das ich nach 2 Wochen noch kein professor in c bin.

    Verlangt ja gar keiner. Du solltest nur deine Frage so artikulieren, dass irgendwie klar wird, was du wissen willst. Manche verstehen nicht, was return macht, andere verstehen nicht, was Rekursion ist. Du hast gefragt was die 1 macht.

    Woher weis das Programm das es nicht mal null nehmen darf?
    Weil in der Funktion wird ja so zusagen gesagt es soll jetzt 5*4*3*2*1 gerehcnet werden aber ja nicht *0.

    Weil die Abbruchbedingung so gestellt ist. Wenn n==0 wird 1 zurückgegeben, sonst (also n ungleich 0) wird n mal "der Rest" gerechnet.



  • Ja ok sry 😉
    Alles klar ich drücke mich nächstes mal genauer aus 😉
    Viel dnak für die Hilfe so die einzigste Sache was ich halt noch nciht versteh ist, wraum das Ergebnis aufeinmal das doppelte ist wenn ich statt "return 1" "return 2" hinschreibe 😕



  • Das Programm berechnet sogar 5*4*3*2*1*1
    Die zweite 1 wird zurückgegeben wenn als Parameter 0 übergeben wird.

    5! = 5 * (5-1)!
       = 5 * 4!  
       = 5 * 4 * (4-1)!  
    ... 
       = 5 * 4 * 3 * 2 * 1 * (1-1)!
       = 5 * 4 * 3 * 2 * 1 * 0! 
       = 5 * 4 * 3 * 2 * 1 * 1
    

    Denn 0! ist per Definition 1



  • GhostfaceChilla schrieb:

    wraum das Ergebnis aufeinmal das doppelte ist wenn ich statt "return 1" "return 2" hinschreibe 😕

    Ist vielleicht klar wenn da statt 5*4*3*2*1*1 dann 5*4*3*2*1*2 steht.



  • DirkB schrieb:

    Ist vielleicht klar wenn da statt 5*4*3*2*1*1 dann 5*4*3*2*1*2 steht.

    Na ob das wirklich SO klar ist? ;-))



  • Alles klar danke 😉



  • gerade für so einen Fall würde sich ein Debugger anbieten.

    Ganz besonders, wenn ein Programm zwar "läuft", aber das Ergebnis nicht dem erwarteten oder gewünschten entspricht, hilft ein Debugger oft Wunder, um die "Zwischenergebnisse" zur Laufzeit anzusehen, zu vergleich, zu analysieren.


Log in to reply