Autor |
Beitrag |
r0nIno
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 31.08.05 19:29
Hi Leute,
ich hoffe es ist nicht zu dreist hier nen Info Projekt reinzustellen und einfach mal zu fragen ob ihr mir bei nen paar Sachen helfen könntet. Also und zwar geht es um das große Thema Rekursion.
Unsere Aufgabe ist es, ein Programm zu entwerfen zu diesen Thema:
Mars Mission 2012 -- Shuttle landet 500 km vom Basislager entfernt -- 450 Dosen Nahrung hat ein Astronaut -- 12 kann er nur bei sich tragen -- pro Dose kann er 15 km laufen
Wir sollen uns jetzt ne Strategie überlegen. Meine war es, dass der Astronaut alle Dosen jewals immer 15 km weiterschleppt und dann die nächsten 15 km angeht. Dazu hab ich mir folgende Funktion überlegt, aber irgendwie scheint daran noch etwas falsch zu sein.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function lauf(Dalt,Dneu,Dver:integer):integer; var Dtra,c,s,Weg:integer; begin if Dalt < Dtra then begin c:=Dtra; Dtra:=Dalt; end else if s>= Weg then lauf:=(Dver*15) else if Dalt = 0 then begin Dalt:=Dneu; s:=s+15; end else lauf:=lauf(Dalt-12,Dneu+10,Dver+2);
Dtra:=c; end; |
Bei der Eingabe werden folgende Daten eingetragen und übergeben: Weg, Dtra(Anzahl wieviel ein Astronaut tragen kann) und Dalt (Anzahl der Dosen insgesamt)...
Weiss nich sitz jetzt 2 Stunden dran komm aber nicht weiter ... bräuchte nur mal nen Denkansatz, dann geht schon wieter ....
Moderiert von Christian S.: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Mi 31.08.2005 um 20:03
Zuletzt bearbeitet von r0nIno am Mi 31.08.05 21:29, insgesamt 1-mal bearbeitet
|
|
starsurfer
      
Beiträge: 334
Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
|
Verfasst: Mi 31.08.05 20:16
mmmh, funzt doch nich 
_________________ GEIZ IST GEIL! - Ihr Sozialamt
Zuletzt bearbeitet von starsurfer am Mi 31.08.05 21:06, insgesamt 1-mal bearbeitet
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 31.08.05 20:32
Könnt ihr mal euren Source korrekt formatieren? Ist ja schrecklich
PS: Sry, dass ich jetzt nicht mehr zum Thema beitragen kann, aber formatieren gehört
zum Programmieren können dazu.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 31.08.05 20:41
Die Strategie haut nicht hin: Mit 12 Dosen kommt der nur 180 Kilometer, außer, der holt sich vom Raumschiff jeweils nachschub.
Da man davon ausgehen kann, das der Mars (außer von grünen Männchen) unbesiedelt ist, kann man davon ausgehen, dass der Astronaut 12 Dosen holen kann, diese 15 km trägt, dabei eine verbraucht und zehn Dosen abstellt, bevor er sich eine nimmt, um wieder zur Landebasis zurückzukehren, um die nächsten zu holen. Das macht er so lange, bis keine Dosen mehr im Basislager sind und er mit seinem zwischenlager genauso verfährt, bis er alle Dosen weitere 15 km transportiert hat ... Die letzten 180 km nimmt er sich gleich 12 Dosen mit und läuft den Rest auf einmal.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
r0nIno 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 31.08.05 21:27
Genau so mein ich es ja ... mir fehlt nur der Code dazu ... wie gesagt ... oben ist mein Versuch haut aber noch nicht ganz hin! Deswegen frag ich ...
Streategie is schon richtig, vllt. isses nich rausgekommen, aber so wie du es schreibst mein ich es auch ...
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 31.08.05 21:43
Bei dir im Source gibt es ja undefinierte Variablen! Nicht die Compiler-Meldung gesehen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function Lauf(DAlt, DNeu, DVer: Integer): Integer; var DTra, C, S, Weg: Integer; begin if DAlt < DTra then begin C := DTra; DTra := DAlt; end; if S >= Weg then begin DTra := C; Lauf := (DVer * 15) end;
if DAlt = 0 then begin DAlt := DNeu; S := S + 15; end else Lauf := Lauf(DAlt - 12, DNeu + 10, DVer + 2); |
Außerdem wird 'S' nie verwendet.
Guck dir den formatierten Source nochmal an und überlege was falsch daran ist.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
r0nIno 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 31.08.05 21:57
Dtra ist definiert, da es eingegeben und übergeben wird in der Eingabe Prozedur.
s muss ich am anfang der Funktion mit s:=0; definieren. Denk ich ma ... und von der Idee her könnte es soweit überhaupt erst einmal richtig sein?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| function Lauf(DAlt, DNeu, DVer: Integer): Integer; var DTra, C, S, Weg: Integer; begin s:=0; if DAlt < DTra then begin C := DTra; DTra := DAlt; end; if S >= Weg then begin DTra := C; Lauf := (DVer * 15) end;
if DAlt = 0 then begin DAlt := DNeu; S := S + 15; end else Lauf := Lauf(DAlt - 12, DNeu + 10, DVer + 2); |
|
|
zemy
      
Beiträge: 207
Win XP Prof.
D7
|
Verfasst: Do 01.09.05 11:11
ja nee... DTra ist nicht definiert. Nur DAlt, DNeu und DVer sind mit Übergeben.
_________________ LifeIsToShortToThinkAboutTheShortness
|
|
Grishnak
      
Beiträge: 221
Windows XP Home
Delphi 7 PE, Delphi 2005 PE
|
Verfasst: Fr 09.09.05 22:14
Ohne mir deinen Code angekuckt zu haben, möchte ich folgendes einbringen:
Versuch' das Problem rückwärts zu lösen:
- Im letzten Zwischenlager (das 180km von der Basis entfernt ist) müssen sich 12 Dosen befinden, diese nimmt der Astonaut und kann die 180km (12x15km) zur rettenden Basis zurücklegen.
- Wie kommen 12 Dosen ins letzte Zwischenlager?
- Damit im letzten Zwischenlager 12 Dosen liegen, müssen diese vom vorletzen Zwischenlager dorthingeschafft worden sein...
Ein zweiter Ansatz könnte sein, sich Gedanken zu machen, was der optimale Abstand zwischen zwei Zwischenlagern ist. Ist der Abstand klein (15km) kann der Astronaut 11 Dosen befördern (er trägt 12 hin, benötigt aber eine für den Rückweg. Ist der Abstand groß (90km) kann der Astronaut 1 Dose befördern (er geht mit 12 los, benötigt für den Hinweg 5 Dosen, legt 1 Dose ab und benötigt für den Rückweg 6 Dosen).
Außerdem glaube ich, dass man nach der Hälfte der Strecke die Strategie ändern muss: vorher -> Vorräte anlegen, nachher Vorräte aufbrauchen
|
|
Apfelmobs
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 12.09.05 20:32
Titel: help
ok, bin in dem selben info-projekt wie rOnIno..
brauche auch Hilfe zu dem Projekt und bin der Meinung ein relativ gutes iteratives programm geschrieben zu haben, krich dis halt nur nicht in rekursive form umgeschrieben... bitte um Hilfe... is dringend ;(
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| unit astronautending;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var lag1, lag2, weg: integer; begin lag1:= 450; lag2:=0; weg:=500; repeat weg:=weg-15; repeat if lag1<=13 then begin lag2:=lag2+lag1-1; lag1:=0; end else begin lag1:=lag1-13; lag2:=lag2+11; end; listbox1.Items.add(inttostr(lag1)+' '+inttostr(lag2)+' '+inttostr(500-weg)); until lag1 <= 0; lag1:=lag2; lag2:=0; until weg<=195;
end;
end. |
Moderiert von AXMD: Code- durch Delphi-Tags ersetzt.
|
|
dirkr
Hält's aus hier
Beiträge: 1
|
Verfasst: Di 13.09.05 23:08
Hallo Ihr Zwei
Wenn ich die Aufgabe richtig verstehe, geht es darum, so viele Dosen wie möglich zur Basis zu transportieren und dabei als Programmiertechnik auf eine rekursive Lösung zurück zu greifen?
Vorausgesetzt, das ist die Aufgabenstellung, dann schlage ich Euch folgende Lösung vor:
Solange die Anzahl der aktuellen Dosen ausreicht, ist das Vorgehen ja immer gleich: Der Astronaut nimmt aus dem aktuellen Lager zwölf Stück, transportiert sie 15 Kilometer weiter und kehrt zurück.
Somit werden also effektiv pro zwölf Dosen zehn Stück weiter transportiert - zwei sind Wegzehrung.
Mathematisch könnte man mit (Dosen + 11) div 12 die Anzahl der Transporte bestimmen, die nötig sind, bis das aktuelle Lager 15 km weiter bewegt wurde.
Pro Transport gehen zwei Dosen verloren.
Am Ende jeder Runde bleiben Dosen mod 12 Stück übrig, die noch weiter transportiert werden müssen - falls nur eine Dose im alten Lager übrig ist, lohnt sich zwar der Aufwand nicht (gleiches Ergebnis), aber das Ziel der Aufgabe ist ja nicht Effizienz sondern ein maximaler Dosenbestand am Ende. Und dafür ist dieser Fall mathematisch irrelevant.
Nach jedem Schritt sind also (aufgerundet) Dosen - (Dosen + 11) div 12) * 2 Stück Dosen übrig.
Das kann man vereinfachen zu Dosen - (Dosen + 5) div 6, ohne das Ergebnis zu beeinflussen! Sieht vielleicht besser aus
Hier kommt dann - wie bei solchen Aufgaben üblich - erst die Rekursion ins Spiel, indem basierend auf der neuen Zahl an Dosen und der nun verringerten Distanz der gleiche Vorgang (rekursiv) aufgerufen wird:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure astronaut () var rest: Integer; begin rest := trage (500, 450); ShowMessage ('Am Ende sind ' + IntToStr (rest) + ' Dosen übrig'); end;
function trage (distanz: Integer; dosen: Integer) begin if (distanz > 0) then result := trage (distanz - 15, dosen - (dosen + 5) div 6) else result := dosen; end; |
Da im Vorfeld bewiesen werden kann, dass die Zahl der Dosen auf jeden Fall ausreicht, ist eine Überprüfung, ob die Dosen auch ausreichen, nicht unbedingt nötig.
Es ist nicht wichtig, dass Ihr während eines Transport extra per Schleife 'simuliert', wie der Astronaut die Dinger hin und her bewegt, weil man davon letztendlich nichts sieht und es eleganter ist, mit einer Formel wie oben zu arbeiten.
Ich hoffe, ich habe Euch geholfen.
Liebe Grüße
Dirk
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt.
|
|
Grishnak
      
Beiträge: 221
Windows XP Home
Delphi 7 PE, Delphi 2005 PE
|
Verfasst: Mi 14.09.05 00:08
Bei...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure astronaut (); var rest: Integer; begin rest := trage (405, 450); ShowMessage ('Am Ende sind ' + IntToStr (rest) + ' Dosen übrig'); end; |
...bleiben am Ende 1 Dose übrig!
Ab einer Distanz von 406 bleiben keine Dosen mehr übrig! Wie will der Astronaut die letzten 95 (bzw. 95-15=80) Kilometer zurücklegen?
Ich nicht, dass es darauf ankommt, möglichst viele Dosen vom Landeplatz zur Basis zu transportieren, sondern die Basis überhaupt zu erreichen. Dort wird es dann wohl genügend Nahrung geben!
_________________ Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
|
|
Apfelmobs
Hält's aus hier
Beiträge: 3
|
Verfasst: Mi 14.09.05 06:58
hi erstmal vielen Dank dirkr...
dass am km 405 oder was keine dosen mehr übrig sind, liegt daran, dass er ja schon bei km 305 mit 13 dosen, die er ja noch hat durchstarten kann, wie Grishnak meinte is es nicht so wichtig möglichst viele dosen ins lager zu bekommen...
aber ich glaub, soweit ich das jetzt überblickt habe, funktioniert es ja trotzdem wenn man die distanzabfrage einfach nicht auf 0 setzt sondern auf 195.
also danke erstmal, versuch dis denn jetzte mal 
|
|
Apfelmobs
Hält's aus hier
Beiträge: 3
|
Verfasst: So 25.09.05 17:46
hm, also nach längere Pause mal wieder ein post.
Hab das ding jetzt wieder gekricht und auch selber gemerkt, dass das so nicht funktioniert. Außerdem wärs gut, wenn ihr mir nochmal die formel werklären könntet, seh da immernoch nicht ganz durch...
*kurzvormverzweifeln*
|
|
|