H3/3

radio_controlled
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 107
Registriert: 8. Okt 2010 20:31

H3/3

Beitrag von radio_controlled »

Hallo
Ich schaffe es nicht mit der Formel auf die Elemente im pascalschen Dreieck zu kommen.
Ich wähle das Element 2,2 (Siehe Bild)
p(2,2) = p(1,1) + p(1,2) = 1 + 1 = 2 != 1

Was habe ich falsch gemacht? Wie geht es richtig?

Gruß
Dateianhänge
Screenshot.png
Screenshot.png (1.75 KiB) 1203 mal betrachtet

ISTler
Erstie
Erstie
Beiträge: 22
Registriert: 3. Mai 2010 12:23

Re: H3/3

Beitrag von ISTler »

Da 2==2 ist es direkt 1.

radio_controlled
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 107
Registriert: 8. Okt 2010 20:31

Re: H3/3

Beitrag von radio_controlled »

ahh
danke
ich hatte s und z gegen eins geprüft...

studentabc
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 31. Okt 2011 13:56

Re: H3/3

Beitrag von studentabc »

Generell habe ich die Rekursion in Assembler verstanden, aber ich komme mit der der Aufgabe nicht zurecht.
Ich muss ja hier zwei Rekursionsaufrufe in einem Schritt machen. Jedoch stehen in meinen Registern nachdem der erste Aufruf (mit seinen restlichen Schritten) ausgeführt wurde natürlich die zuletzt genutzten Werte, unabhänging davon welche Register ich benutze!

Kann mir jemand weiterhelfen?

simon.r
Mausschubser
Mausschubser
Beiträge: 59
Registriert: 4. Okt 2010 16:13

Re: H3/3

Beitrag von simon.r »

Du könntest das Zwischenergebnis des ersten Aufrufs auf dem Stack speichern.

studentabc
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 31. Okt 2011 13:56

Re: H3/3

Beitrag von studentabc »

Und woher weiß ich wie tief ich dann im Stack bin, also wo das Zwischenergebnis liegt?
Das muss ich ja alles mit dokumentieren! Auch das ausrechnen mit Stack wird somit komplizierter!

dschneid
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 271
Registriert: 14. Dez 2009 00:56

Re: H3/3

Beitrag von dschneid »

studentabc hat geschrieben:Und woher weiß ich wie tief ich dann im Stack bin, also wo das Zwischenergebnis liegt?
Das muss ich ja alles mit dokumentieren! Auch das ausrechnen mit Stack wird somit komplizierter!
Das ist nunmal so, dass auch die einfachsten kleinen Programme in Assembler eklig sind. Deswegen gibt's ja auch höhere Programmiersprachen.

Es ist aber nicht so schwer, wie du denkst, wenn du strukturiert vorgehst: Jeder rekursive Aufruf kann sein Ergebnis in einem Register zurückgeben (immer demselben natürlich), dann ist auch klar, wo das liegt. Außerdem muss einfach direkt nach jedem rekursiven Aufruf alles, was dafür auf den Stack gelegt wurde, wieder gelöscht werden. Da du weißt, was du pro Aufruf drauflegst, weißt du auch, was wieder runter muss. Weil dann jeder Aufruf nur noch eine Rekursionebene des Stacks betrachtet, ist auch die konkrete Tiefe egal.

Wie man rekursiv programmiert muss aber doch in der Vorlesung erwähnt sein worden...

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: H3/3

Beitrag von Ronny »

Es wird auch einfacher, wenn du %ebp wie in der Vorlesung beschrieben verwendest.

neoatlant
Mausschubser
Mausschubser
Beiträge: 58
Registriert: 14. Okt 2010 22:16

Re: H3/3

Beitrag von neoatlant »

Genau, wenn du wie in der Vorlesung erwähnt wurde immer %ebp benutzt um quasi auf der aktuellen stack frame zu zeigen und dann mit esp die lokalen variablen referenziert
dann weisst du immer genau wo die Zwischenergebnisse zu finden sind, schau dir nochmal die Folien genau an ;)

Gruß

majias
Neuling
Neuling
Beiträge: 7
Registriert: 9. Nov 2011 22:34

Re: H3/3

Beitrag von majias »

Hi,
wir haben wirkliche Probleme mit der Aufgabe. Das Beispiel in der Vorlesung mit der Fakultät haben wir verstanden. Bisher wurden feste Werte auf dem Stack zwischengespeichert und am Ende, wenn die Rekursionstiefe erreicht wurde, verrechnet.

Dieses mal müssen wir ja aber einen Punkt an der Stelle Zeile/Spalte speichern, obwohl wir dessen Wert noch nicht kennen. Wir wissen ja eigentlich das wir Zwischenergebnisse brauchen, die sich aus den vorherigen Berechnungen ergeben, aber uns geht es nicht in den Kopf wie man diese denn zwischenspeichert, herbekommt und sonstwie errechnet.

Wir sind ziemlich verwirrt. :lol:

majias
Neuling
Neuling
Beiträge: 7
Registriert: 9. Nov 2011 22:34

Re: H3/3

Beitrag von majias »

Sehen wir das richtig, dass man die Unterfunktion zweimal aufrufen muss, um den Wert von einem Punkt zu berechnen? Einmal für den Punkt (z-1,s-1) und einmal für den Punkt (z-1,s) ?

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: H3/3

Beitrag von Ronny »

majias hat geschrieben:Sehen wir das richtig, dass man die Unterfunktion zweimal aufrufen muss, um den Wert von einem Punkt zu berechnen? Einmal für den Punkt (z-1,s-1) und einmal für den Punkt (z-1,s) ?
Ja, das ist richtig.

JulM
Mausschubser
Mausschubser
Beiträge: 47
Registriert: 1. Okt 2009 19:25

Re: H3/3

Beitrag von JulM »

Sollen s und z eigentlich per Eingabe an das Programm gegeben werden oder einfach nur als Variablen direkt im Code?
Und soll das Programm auch auf ungültige Eingaben reagieren, also falls s und z am Anfang kleiner 1 sind oder s > z?

Benutzeravatar
zimpfer
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 144
Registriert: 15. Mär 2009 01:07

Re: H3/3

Beitrag von zimpfer »

JulM hat geschrieben:Sollen s und z eigentlich per Eingabe an das Programm gegeben werden oder einfach nur als Variablen direkt im Code?
Und soll das Programm auch auf ungültige Eingaben reagieren, also falls s und z am Anfang kleiner 1 sind oder s > z?
Schreiben Sie ein Assemblerprogramm, das zu Beginn in den Variablen z und s die Zeile und die Spalte eines Elements enthält und mit Hilfe der obigen Formel rekursiv den Wert p(z, s) berechnet.

downsampling
Mausschubser
Mausschubser
Beiträge: 95
Registriert: 28. Mär 2011 22:58

Re: H3/3

Beitrag von downsampling »

Es wird einem doch nicht negativ angerechnet, wenn man es doch per EIngabe auf der Konsole gemacht hat ?(ist immerhin beim Testen komfortabler )

Antworten

Zurück zu „Archiv“