Autor Beitrag
r0nIno
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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.

ausblenden 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 user profile iconChristian 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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++
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 31.08.05 20:32 
Könnt ihr mal euren Source korrekt formatieren? Ist ja schrecklich :roll:

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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 31.08.05 21:43 
Bei dir im Source gibt es ja undefinierte Variablen! Nicht die Compiler-Meldung gesehen?

ausblenden 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       // DTra undefiniert;     | wenn du danach ein 'else'
  begin                     //                       | verwendest, wird die Funktion
    C    := DTra;           // immer noch;           | 'Lauf' gar nicht mehr auf-
    DTra := DAlt;           // erst jetzt definiert; | gerufen und wird beendet.
  end;
 
  if S >= Weg then          // S undefiniert; muss nicht in 'else';
  begin
    DTra := C;              // da 'else' weg, DTra hier hin;
    Lauf := (DVer * 15)     // 'Result' ist besser (trotzdem selber Effekt);
  end;

  if DAlt = 0 then          // muss auch nich in 'else';
  begin  
    DAlt := DNeu;  
    S    := S + 15;         // S immer noch undefiniert; erst danach definiert;
  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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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?

ausblenden 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       // DTra undefiniert;     | wenn du danach ein 'else'
  begin                     //                       | verwendest, wird die Funktion
    C    := DTra;           // immer noch;           | 'Lauf' gar nicht mehr auf-
    DTra := DAlt;           // erst jetzt definiert; | gerufen und wird beendet.
  end;
 
  if S >= Weg then          // S undefiniert; muss nicht in 'else';
  begin
    DTra := C;              // da 'else' weg, DTra hier hin;
    Lauf := (DVer * 15)     // 'Result' ist besser (trotzdem selber Effekt);
  end;

  if DAlt = 0 then          // muss auch nich in 'else';
  begin  
    DAlt := DNeu;  
    S    := S + 15;         // S immer noch undefiniert; erst danach definiert;
  end 
  else
    Lauf := Lauf(DAlt - 12, DNeu + 10, DVer + 2);
zemy
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 207

Win XP Prof.
D7
BeitragVerfasst: Do 01.09.05 11:11 
ja nee... DTra ist nicht definiert. Nur DAlt, DNeu und DVer sind mit Übergeben.

_________________
LifeIsToShortToThinkAboutTheShortness
Grishnak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 221

Windows XP Home
Delphi 7 PE, Delphi 2005 PE
BeitragVerfasst: 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



BeitragVerfasst: 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 ;(

ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 user profile iconAXMD: Code- durch Delphi-Tags ersetzt.
dirkr
Hält's aus hier
Beiträge: 1



BeitragVerfasst: 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:

ausblenden 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 (500450);
  ShowMessage ('Am Ende sind ' + IntToStr (rest) + ' Dosen übrig');
end;

function trage (distanz: Integer; dosen: Integer)
begin
  if (distanz > 0then
    result := trage (distanz - 15, dosen - (dosen + 5div 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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
Grishnak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 221

Windows XP Home
Delphi 7 PE, Delphi 2005 PE
BeitragVerfasst: Mi 14.09.05 00:08 
Bei...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure astronaut ();
var
  rest: Integer;
begin
  rest := trage (405450);
  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



BeitragVerfasst: 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



BeitragVerfasst: 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*