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