/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Towers of Hanoi
Fra : Henrik Koksby Hansen


Dato : 07-03-02 17:29

Subj. skal laves med almindelige rekursive funktioner i Visual C++ -
så simpelt som muligt (og på så lavt niveau, som muligt)...
Jeg er simpelthen tør for idéer, eller også kan jeg bare ikke overskue
det.

Nogen, der kan give mig et par hurtige tips og nogle kodestumper, evt.
? :)

 
 
Claus Rasmussen (07-03-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 07-03-02 17:49

Henrik Koksby Hansen wrote:

> Jeg er simpelthen tør for idéer, eller også kan jeg bare ikke overskue
> det.

Lektier ?


> Nogen, der kan give mig et par hurtige tips ..........................

Lav en funktion med flg. forskrift:

void flyt(int antal, int fra_pind, int via_pind, int til_pind)

der altså flytter 'antal' ringe fra en pind til en anden ved at bruge
den tredje som mellemstation.

Inde i funktionen har du en if-sætning, der spørger om 'antal == 1'. I
så fald er det trivielt. Ellers bruger du et rekursivt kald, hvor du
benytter dig af, at for at flytte 'antal' ringe fra een pind til en
anden kan du dele problemet op i at

1. Flytte 'antal - 1' ring fra 'fra_pind' til 'via_pind'
2. Flytte den sidste ring fra 'fra_pind' til 'til_pind'
3. Flytte 'antal - 1' pinde fra 'via_pind til 'til_pind'

Som du kan se, kan du kalde din 'flyt' funktion rekursivt, og det
sker hver gang med et 'antal', der bliver mindre og mindre og til
sidst lig med 1, hvor du så er tilbage i det trivielle eksempel.

> ............................................og nogle kodestumper, evt.
> ? :)

Nix. Det lærer du intet ved.

-Claus


Rune Klausen (07-03-2002)
Kommentar
Fra : Rune Klausen


Dato : 07-03-02 23:40


"Claus Rasmussen" <clr@cc-consult.dk> wrote in message
news:a685mm$m93$1@sunsite.dk...

> Nix. Det lærer du intet ved.

Hvis man kan noget i forvejen, og sidder og gennem analysere hele koden, så
man forstår hver enkelt ting, så kan man godt lærer noget, det er ikke
meget, men lidt, og selv skrive programmer utal af gange, det er noget som
hjælper med at udvide sit repetuar :)

Det er lidt ligesom at snakke, jo mere man gør det, jo bedre bliver du til
at mestre sproget.

-Rune



Henrik Koksby Hansen (08-03-2002)
Kommentar
Fra : Henrik Koksby Hansen


Dato : 08-03-02 09:21

> > ............................................og nogle kodestumper, evt.
> > ? :)
>
> Nix. Det lærer du intet ved.
[...]

Pseudo er lige så godt. 1000 tak, jeg tror jeg har gennemskuet det nu.
Nogle gange skal man bare lige have et spark i startknappen, for at komme igang. :)

VH
Henrik

Nej (09-03-2002)
Kommentar
Fra : Nej


Dato : 09-03-02 16:26

Hej hej!

-----

#include <stdio.h>

char *pind_navn[4] = { "", "pind A", "pind B", "pind C" };

int find_hjaelpepind(int pind1, int pind2)
{
switch(pind1) {
case 1:
if (pind2 == 2)
return 3;
else
return 2;
;;

case 2:
if (pind2 == 1)
return 3;
else
return 1;
;;

case 3:
if (pind2 == 1)
    return 2;
else
return 1;
;;
};
}


void hanoi(int skiver, int start_pind, int slut_pind)
{
int hjaelpe_pind = find_hjaelpepind(start_pind, slut_pind);

if (skiver == 0)
return;

/* Flyt alle undtagen nederste skive fra start_pind til hjaelpe_pind */
hanoi(skiver-1, start_pind, hjaelpe_pind);

/* Flyt nederste skive fra start_pind til slut_pind */
printf("Flyt skive %d fra %s til %s\n", skiver, pind_navn[start_pind],
pind_navn[slut_pind]);

/* Flyt skiverne fra hjaelpe_pind til slut_pind */
hanoi(skiver-1, hjaelpe_pind, slut_pind);
}


int main(int argc, char *argv[])
{
int i, disks = 7;

if (argc > 1) {
disks = atoi(argv[1]);
if (disks <= 0) {
printf("Syntaks: %s antal_skiver pindnavn1 pindnavn2
pindnavn3\n",
argv[0]);
    return 1;
}
}

for (i = 2; (i <= 4); i++) {
if (argc > i)
pind_navn[i-1] = argv[i];
}

hanoi(disks, 1, 3);
}

----
> Subj. skal laves med almindelige rekursive funktioner i Visual C++ -> så
simpelt som muligt (og på så lavt niveau, som muligt)...> Jeg er simpelthen
tør for idéer, eller også kan jeg bare ikke overskue> det.> > Nogen, der kan
give mig et par hurtige tips og nogle kodestumper, evt.> ? :)




Byrial Jensen (09-03-2002)
Kommentar
Fra : Byrial Jensen


Dato : 09-03-02 21:18

Nej <æmann@lort.kom> skrev:
> int find_hjaelpepind(int pind1, int pind2)
> {

Her er mit forslag til en noget simplere implementation af
funktionen:

int find_hjaelpepind(int pind1, int pind2)
{
return 1 + 2 + 3 - pind1 - pind2;
}

Troels Thomsen (10-03-2002)
Kommentar
Fra : Troels Thomsen


Dato : 10-03-02 16:54


"Henrik Koksby Hansen" <kaptajnen@koksby.dk> wrote in message
news:ff35b926.0203070829.2b025f6d@posting.google.com...
> Subj. skal laves med almindelige rekursive funktioner i Visual C++ -

Der fíndes iøvrigt en ikke-rekursiv metode der er væsentlig nemmere for alm
mennesker at uføre, og som ikke potentielt får computeren til at løbe tør
for
hukommelse pga alle disse rekursive kald.

Men det er din programmeringslærer sikkert ligeglad
med.....

Flyt i ulige træk den mindste én til højre (med wrap-around). I de lige træk
flytter man så en af de andre skiver (Der er kun en mulighed hver gang)
Voila :)

Jeg skulle selv prøve den på et stykke papir før jeg trode på den!

mvh Troels





Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste