Seite 1 von 1

Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 16:25
von mara1015
Hallo
Ich hoffe ihr könnt mir bei meinem Problem helfen. Ich habe folgendes Programm:

Code: Alles auswählen

def Anz(n,t):
    if t>n:return 0
    if n%t==0:return 1+Anz(n,t+1)
    return Anz(n,t+1)
Ich verstehe das Programm nicht,
wenn ich jetzt Anz(12,1) eingebe, kommt als Ergebnis 6 raus.
Wenn ich Anz(19,5) eingebe kommt 1 als Ergb. raus.

Kann mir jemand das Programm erklären.
danke

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 16:28
von BlackJack
@mara1015: Das klingt verdächtig nach Hausaufgabe, die jemand für Dich lösen soll.

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 16:31
von mara1015
hey
nein , ich schreibe nächste Woche (leider) eine Klausur an der Uni und bin kein Info-Ass.
Ich versuche gerade einige Aufgaben nach zu vollziehen und zu verstehen.

Leider hatten wir nur 2mal Tutorium,da die Tutorien einen scheren Unfall hatte und es dadurch mehrere Monate ausgefallen ist. Ersatz gab es leider nicht.

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 16:40
von ocoal
Hallo auch,

Vorschlag: versuch doch mal zu beschreiben, was *Deiner* Meinung nach der Algorythmus macht.

Denn "eigentlich" würdest Du Dir gemäß An alle Schüler und Studenten mit Informatikproblemen hier vermutlich eher die Zähne ausbeissen ... so tragisch und nachvollziehbar Deine Erklärungen auch ausfallen mögen.

Deswegen mein Vorschlag ... probier mal :) ...
Und als Tipp: Zerleg den Code am besten in verständlichere Abläufe/Teile.

-Colin-

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 16:41
von BlackJack
@mara1015: Wo liegen denn die Verständnisschwierigkeiten? Das ist doch eigentlich recht einfach und lässt sich auf einem Blatt Papier nachvollziehen. Schreib Dir doch mal den Programmablauf für die beiden Zahlenpaare auf. Wo hakt es da, wo kommst Du nicht weiter?

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 16:55
von mara1015
Also wenn ich Anz(8,9) eingebe kommt 0 raus . Das ist klar da bei der Ersten if bedingung dies so verlangt wird --> t>n: return 0

Bsp: Anz(12,1)
Bei der zweiten If bedingung komm ich nicht weiter.
wenn bei n/t der Restwert 0 ergibt: mache: return 1 (gebe 1 aus)+ Anz(n,t+1)

Hier ist mein Problem: was macht Anz (n,t+1) ? macht er dann Anz(12,1) wird zu (12,2) ?
und läuft das Programm von vorne wieder ab? nur diesmal mit Anz(12,2) ?

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 17:11
von BlackJack
@mara1015: ``Anz(n,t+1)`` ruft die Funktion mit den dort angegeben Werten auf und liefert dem Aufrufer das Ergebnis. Letztendlich wie jeder andere Funktionsaufruf auch.

Für das ``return`` wird erst der komplette Rückgabewert berechnet. Das sind also nicht irgendwie zwei Teile sondern ``1 + Anz(n, t + 1)`` wird erst komplett ausgerechnet und dann erst an den Aufrufer zurück gegeben.

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 17:25
von mara1015
sorry,
verstehen tue ich es imemr nohc nicht.
Ich fasse es noch mal mit meinen Worten zusammen:
a) Wir haben keine Schleife, somit läuft das Programm nur einmal!
b) wenn t>n ist, kommt 0 als Erg. raus
c) du hast geschrieben, dass Anz (n,t+1) ruft den Wert auf und gibt ihn aus. Was gibt er aus? (bsp def Anz (12,1) kommt dann als Ergebnis 12,2 raus ? Was macht er dann damit?

d) das mit return 1 habe ich glaube ich verstanden, aber oben bei c) haeb ich noch verständinis probleme.


Was macht er dann mit (12,2)?

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 17:42
von cofi
Stichwort Rekursion.

a) Wuerde ich nicht zustimmen, schliesslich haben wir Rekursion.

`Anz(n, t+1)` ist der Rekursionsschritt und ja der wird berechnet und ist (im Grunde) nichts anderes als ein erneuter Aufruf.

`Anz(2, 1)` rollt sich z.B. so aus: 1 + Anz(2, 2) = 1 + 1 + Anz(2, 3) = 1 + 1 + 0 = 2

`Anz(5, 3)` so: Anz(5,3) = Anz(5, 4) = Anz(5, 5) = 1 + Anz(5, 6) = 1 + 0 = 1

Nimm dir ein Blatt Papier und mach das so lange bis du die Rekursion verstanden hast.

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 17:54
von BlackJack
@mara1015: a) Jedes Programm läuft nur einmal (pro Start), auch mit Schleife. Nur die Anweisungen innerhalb der Schleife werden mehrfach ausgeführt.

b) Das Ergebnis eine Aufrufs von `Anz()` ist 0 wenn ``t > n`` für diesen Aufruf gilt, ja.

c) Es wird dort nichts aus- sondern zurück gegeben und zwar der Wert von ``1 + Anz(n, t + 1)``, nicht nur der Wert den der Aufruf ``Anz(n, t + 1)`` zurück gibt. Bevor ein Wert zurück gegeben wird, muss erst der *gesamte* Ausdruck hinter der ``return``-Abweisung ausgwertet werden. Und wenn `Anz()` mit den Werten 12 und 1 aufgerufen wurde, dann musst Du an der Stelle ``Anz(12, 2)`` *ausrechnen* und das Ergebnis dort für den Aufruf einsetzen.

d) Nochmal: Es gibt kein ``return 1`` in der Funktion sondern ``return 1 + Anz(n, t + 1)``.

Welche Beispiele habt ihr denn in der Vorlesung durchgearbeitet? Welche stehen in euren Unterlagen? Im Lehrbuch?

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 17:55
von ocoal
Die Rekursion kommt hier zustande:

Code: Alles auswählen

def Anz(n,t):
    ...
    ... return 1+Anz(n,t+1) # <- die Funktion ruft sich selbst auf
    return Anz(n,t+1) # <- die Funktion ruft sich selbst auf
Hier findest du die *Rekursive Funktion* recht einfach erklärt: http://www.gwasch.de/homepage/informatik/rekfunk.pdf

-Colin-

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 18:13
von lunar
@mara1015 Betrachte die Ausführung dieses Prorgamms mal im Online Python Tutor.

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 18:55
von mara1015
läuft das Programm immer bis 0 runter?

Re: Anfänger braucht dringend Hilfe ;-(

Verfasst: Freitag 13. Juli 2012, 19:40
von BlackJack
@mara1015: Falls Du mit der Frage meinst ob es in den t > n Fall läuft, dann überlege Dir mal wie sich t und n bei jedem rekursiven Aufruf ändern.