Anfänger braucht dringend Hilfe ;-(

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mara1015
User
Beiträge: 11
Registriert: Freitag 13. Juli 2012, 16:17

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
Zuletzt geändert von Anonymous am Freitag 13. Juli 2012, 16:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@mara1015: Das klingt verdächtig nach Hausaufgabe, die jemand für Dich lösen soll.
mara1015
User
Beiträge: 11
Registriert: Freitag 13. Juli 2012, 16:17

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.
Benutzeravatar
ocoal
User
Beiträge: 32
Registriert: Mittwoch 20. Juli 2011, 22:44

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-
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?
mara1015
User
Beiträge: 11
Registriert: Freitag 13. Juli 2012, 16:17

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) ?
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.
mara1015
User
Beiträge: 11
Registriert: Freitag 13. Juli 2012, 16:17

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)?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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?
Benutzeravatar
ocoal
User
Beiträge: 32
Registriert: Mittwoch 20. Juli 2011, 22:44

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-
lunar

@mara1015 Betrachte die Ausführung dieses Prorgamms mal im Online Python Tutor.
mara1015
User
Beiträge: 11
Registriert: Freitag 13. Juli 2012, 16:17

läuft das Programm immer bis 0 runter?
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.
Antworten