河内塔 3D 互动演示
2020-12-16 15:51
本 GeoGebra 范例展示了经典的河内塔(Tower of Hanoi)3D 互动模型。用户可以通过界面操作圆盘在三个柱子之间移动,遵循每次只能移动一个圆盘且大盘不能放在小盘上的规则。该模型利用多边形和序列命令构建了立体视觉效果,并实时记录移动步数与圆盘数量。此演示不仅直观呈现了递归算法与数列规律,还帮助学习者深入理解指数增长与逻辑推理在数学谜题中的应用。
所属专题
用GeoGebra制作数学游戏
<?xml version="1.0" encoding="utf-8"?>
<geogebra format="5.0" version="5.0.620.0" app="classic" platform="w" id="d0900baa-b39b-40fa-8941-b3541d14bd20" xsi:noNamespaceSchemaLocation="http://www.geogebra.org/apps/xsd/ggb.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<gui>
<window width="1425" height="627" />
<perspectives>
<perspective id="tmp">
<panes>
<pane location="" divider="0.4014035087719298" orientation="1" />
</panes>
<views>
<view id="4" toolbar="0 || 2020 , 2021 , 2022 , 66 || 2001 , 2003 , 2002 , 2004 , 2005 || 2040 , 2041 , 2042 , 2044 , 2043" visible="false" inframe="false" stylebar="true" location="1,1" size="300" window="100,100,600,400" />
<view id="2" visible="false" inframe="false" stylebar="true" location="3,3" size="275" tab="ALGEBRA" window="717,107,485,866" />
<view id="8" toolbar="1001 | 1002 | 1003 || 1005 | 1004 || 1006 | 1007 | 1010 || 1008 1009 || 66 68 || 6" visible="false" inframe="false" stylebar="false" location="1,3" size="300" window="100,100,600,400" />
<view id="4097" visible="false" inframe="false" stylebar="true" location="1,1" size="395" window="60,168,1784,810" />
<view id="1" visible="true" inframe="false" stylebar="false" location="3" size="572" window="100,100,600,400" />
<view id="16" visible="false" inframe="false" stylebar="false" location="1" size="150" window="50,50,500,500" />
<view id="32" visible="false" inframe="false" stylebar="true" location="1" size="150" window="50,50,500,500" />
<view id="64" toolbar="0" visible="false" inframe="false" stylebar="false" location="1" size="150" window="50,50,500,500" />
<view id="128" visible="false" inframe="false" stylebar="false" location="1" size="480" window="50,50,500,500" />
<view id="70" toolbar="0 || 2020 || 2021 || 2022" visible="false" inframe="false" stylebar="true" location="1" size="150" window="50,50,500,500" />
<view id="512" toolbar="0 | 1 501 5 19 , 67 | 2 15 45 18 , 7 37 | 514 3 9 , 13 44 , 47 | 16 | 551 550 11 , 20 22 21 23 , 55 56 57 , 12 | 69 | 510 511 , 512 513 | 533 531 , 534 532 , 522 523 , 537 536 , 535 | 521 520 | 36 , 38 49 560 | 571 30 29 570 31 33 | 17 | 540 40 41 42 , 27 28 35 , 6 , 502" visible="true" inframe="false" stylebar="false" location="1" size="845" window="660,320,600,400" />
</views>
<toolbar show="false" items="0 39 73 62 | 1 501 67 , 5 19 , 72 75 76 | 2 15 45 , 18 65 , 7 37 | 4 3 8 9 , 13 44 , 58 , 47 | 16 51 64 , 70 | 10 34 53 11 , 24 20 22 , 21 23 | 55 56 57 , 12 | 36 46 , 38 49 50 , 71 14 68 | 30 29 54 32 31 33 | 25 17 26 60 52 61 | 40 41 42 , 27 28 35 , 6" position="1" help="false" />
<input show="false" cmd="true" top="algebra" />
<dockBar show="false" east="false" />
</perspective>
</perspectives>
<labelingStyle val="3"/>
<font size="24"/>
</gui>
<euclidianView>
<viewNumber viewNo="1"/>
<size width="572" height="626"/>
<coordSystem xZero="286" yZero="347.5000000000001" scale="62.29307100053271" yscale="62.29307100053257"/>
<evSettings axes="false" grid="false" gridIsBold="false" pointCapturing="1" rightAngleStyle="1" checkboxSize="26" gridType="3"/>
<bgColor r="255" g="250" b="205"/>
<axesColor r="0" g="0" b="0"/>
<gridColor r="192" g="192" b="192"/>
<lineStyle axes="1" grid="0"/>
<axis id="0" show="false" label="" unitLabel="" tickStyle="1" showNumbers="true"/>
<axis id="1" show="false" label="" unitLabel="" tickStyle="1" showNumbers="true"/>
</euclidianView>
<kernel>
<uses3D val="true"/>
<continuous val="false"/>
<usePathAndRegionParameters val="true"/>
<decimals val="2"/>
<angleUnit val="degree"/>
<algebraStyle val="0" spreadsheet="0"/>
<coordStyle val="0"/>
</kernel>
<tableview min="-2" max="2" step="1"/>
<scripting blocked="false" disabled="false"/>
<euclidianView3D>
<coordSystem xZero="0" yZero="0" zZero="-1.5" scale="50" xAngle="31" zAngle="2088.000376692338"/>
<evSettings axes="false" grid="false" gridIsBold="false" pointCapturing="3" rightAngleStyle="1" gridType="3"/>
<axis id="0" show="false" label="" unitLabel="" tickStyle="1" showNumbers="true"/>
<axis id="1" show="false" label="" unitLabel="" tickStyle="1" showNumbers="true"/>
<axis id="2" show="false" label="" unitLabel="" tickStyle="1" showNumbers="true"/>
<plate show="false"/>
<bgColor r="255" g="239" b="213"/>
<clipping use="false" show="false" size="2"/>
<projection type="1"/>
</euclidianView3D>
<construction title="" author="" date="">
<expression label="seqA" exp="{1, 2, 3, 4, 5}"/>
<element type="list" label="seqA">
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="seqB" exp="{}"/>
<element type="list" label="seqB">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="0"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="seqC" exp="{}"/>
<element type="list" label="seqC">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="0"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="tmp" exp="{}"/>
<element type="list" label="tmp">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="0"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<element type="button" label="buttonReset">
<show object="true" label="true"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<bgColor r="191" g="255" b="0" alpha="255"/>
<layer val="9"/>
<labelOffset x="348" y="98"/>
<labelMode val="3"/>
<tooltipMode val="2"/>
<fixed val="true"/>
<auxiliary val="true"/>
<ggbscript val="seqA=CopyFreeObject(Sequence(n))
seqB={}
seqC={}
tmp={}
tmpA={}
tmpB={}
tmpC={}
moves=0"/>
<font serif="false" sizeM="2" size="24" style="1"/>
<caption val="重新遊戲 Reset"/>
</element>
<expression label="tmpA" exp="{}"/>
<element type="list" label="tmpA">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="8"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="tmpB" exp="{}"/>
<element type="list" label="tmpB">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="8"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="tmpC" exp="{}"/>
<element type="list" label="tmpC">
<show object="false" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="0.10000000149011612"/>
<layer val="8"/>
<labelMode val="0"/>
<animation step="1" speed="1" type="0" playing="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="numeric"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<command name="Length">
<input a0="seqA"/>
<output a0="nA"/>
</command>
<element type="numeric" label="nA">
<value val="5"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
</element>
<command name="Length">
<input a0="seqB"/>
<output a0="nB"/>
</command>
<element type="numeric" label="nB">
<value val="0"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
<ggbscript onUpdate="showDone=nB==n||nC==n"/>
</element>
<command name="Length">
<input a0="seqC"/>
<output a0="nC"/>
</command>
<element type="numeric" label="nC">
<value val="0"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
<ggbscript onUpdate="showDone=nB==n||nC==n"/>
</element>
<expression label="nod" exp="{3, 4, 5, 6, 7, 8}"/>
<element type="list" label="nod">
<show object="true" label="false" ev="4"/>
<objColor r="75" g="0" b="130" alpha="0.10000000149011612"/>
<bgColor r="255" g="255" b="0" alpha="255"/>
<layer val="9"/>
<labelOffset x="424" y="38"/>
<labelMode val="0"/>
<fixed val="true"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<selectedIndex val="2"/>
<comboBox val="true"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
<symbolic val="true" />
</element>
<command name="SelectedElement">
<input a0="nod"/>
<output a0="n"/>
</command>
<element type="numeric" label="n">
<value val="5"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
<ggbscript onUpdate="seqA=CopyFreeObject(Sequence(n))
seqB={}
seqC={}
tmp={}
tmpA={}
tmpB={}
tmpC={}
moves=0"/>
</element>
<expression label="textNod" exp=""選擇圓盤數量 Number of Disks""/>
<element type="text" label="textNod">
<show object="true" label="false" ev="40"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<layer val="9"/>
<labelMode val="0"/>
<fixed val="true"/>
<font serif="false" sizeM="1" size="0" style="1"/>
<absoluteScreenLocation x="64" y="64"/>
</element>
<expression label="textRule" exp=""
遊戲目標是將所有金盤全部移動至另一根銀棒,移動過程必須遵守
以下規定:

 1) 一次只能移動一個金盤。
 2) 只能拿取每根銀棒上最上面的金盤,並放到另一銀棒上。
 3) 較大的金盤不能堆疊在小的金盤之上。

遊戲方式:點擊銀棒或台座,可拿起或放置金盤

The objective of the puzzle is to move the entire stack to another rod,
obeying the following simple rules:

 1) Only one disk can be moved at a time.
 2) Each move consists of taking the upper disk from one of the stacks 
 and placing it on top of another stack or on an empty rod.
 3) No larger disk may be placed on top of a smaller disk.

How to play: click or tap the plate/rod to take or place the disk. 
 ""/>
<element type="text" label="textRule">
<show object="true" label="false" ev="40"/>
<condition showObject="showRule"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<layer val="9"/>
<labelMode val="0"/>
<font serif="false" sizeM="0.7" size="-8" style="1"/>
<absoluteScreenLocation x="22" y="188"/>
<ggbscript val="showRule=false"/>
</element>
<expression label="mm" exp="2^(n) - 1" />
<element type="numeric" label="mm">
<value val="31"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
</element>
<expression label="moves" exp="0"/>
<element type="numeric" label="moves">
<value val="0"/>
<show object="false" label="true"/>
<objColor r="0" g="0" b="0" alpha="0.10000000149011612"/>
<layer val="0"/>
<labelMode val="1"/>
<animation speed="1" type="0" playing="false"/>
</element>
<command name="Polygon">
<input a0="{Corner[1], Corner[2], Corner[3], Corner[4]}"/>
<output a0="polyMask"/>
</command>
<element type="polygon" label="polyMask">
<lineStyle thickness="5" type="0" typeHidden="1" opacity="178"/>
<show object="true" label="false" ev="8"/>
<condition showObject="showRule ∨ showDone"/>
<objColor r="255" g="250" b="205" alpha="0.949999988079071"/>
<layer val="7"/>
<labelMode val="0"/>
<ggbscript val="showRule=false
showDone=false
"/>
</element>
<expression label="showDone" exp="nB ≟ n ∨ nC ≟ n" />
<element type="boolean" label="showDone">
<value val="false"/>
<show object="false" label="true"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<layer val="0"/>
<labelMode val="0"/>
<checkbox fixed="true"/>
</element>
<element type="boolean" label="showRule">
<value val="false"/>
<show object="false" label="true"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<layer val="0"/>
<labelMode val="0"/>
<checkbox fixed="true"/>
</element>
<element type="button" label="buttonRule">
<show object="true" label="true"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<bgColor r="191" g="255" b="0" alpha="255"/>
<layer val="8"/>
<labelOffset x="37" y="98"/>
<labelMode val="0"/>
<tooltipMode val="2"/>
<fixed val="true"/>
<auxiliary val="true"/>
<ggbscript val="showRule=!showRule
showDone=false"/>
<font serif="false" sizeM="2" size="24" style="1"/>
<caption val="遊戲規則 Game Rules"/>
</element>
<expression label="textDone" exp=""恭喜!
您完成了 " + n + " 個金盤的河內塔。
您一共移動了 " + moves + " 次金盤。
(完成遊戲至少需要移動 " + mm + " 次)

Congratulations!
You have solved a Tower of Hanoi puzzle
with " + n + " disks.
Your moves is " + moves + ".
(The minimal number of moves required is " + mm + ")"" />
<element type="text" label="textDone">
<show object="true" label="false" ev="8"/>
<condition showObject="showDone"/>
<objColor r="255" g="0" b="0" alpha="0"/>
<layer val="9"/>
<labelMode val="0"/>
<font serif="false" sizeM="1" size="0" style="1"/>
<absoluteScreenLocation x="35" y="239"/>
<ggbscript val="showDone=false
"/>
</element>
<command name="Polygon">
<input a0="{Corner[1] + (3 / 4 * (Corner[4] - Corner[1])), Corner[2] + (3 / 4 * (Corner[3] - Corner[2])), Corner[3], Corner[4]}"/>
<output a0="polyMenu"/>
</command>
<element type="polygon" label="polyMenu">
<lineStyle thickness="5" type="0" typeHidden="1" opacity="178"/>
<show object="true" label="false" ev="8"/>
<objColor r="255" g="127" b="0" alpha="1"/>
<layer val="8"/>
<labelMode val="0"/>
</element>
<expression label="rodA" exp="{Cylinder[(0, 4, -1), (0, 4, 4), 0.3], Prism[(0 + 2.5, 4 + 2.5, -1), (0 - 2.5, 4 + 2.5, -1), (0 - 2.5, 4 - 2.5, -1), (0 + 2.5, 4 - 2.5, -1), (0 + 2.5, 4 + 2.5, -0.5)]}" />
<element type="list" label="rodA">
<show object="true" label="false" ev="4"/>
<objColor r="0" g="0" b="255" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<ggbscript val="If[tmp=={}&&seqA!={},SetValue(tmpA,Insert(tmpA,{Min(seqA)},1))]
If[tmp=={}&&seqA!={},SetValue(seqA,Remove(seqA,{Min(seqA)}))]

If[tmp!={}&&(seqA=={}||Min(seqA)>Min(tmp))&&tmpA=={},SetValue(moves,moves+1)]
If[tmp!={}&&(seqA=={}||Min(seqA)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqA=={}||Min(seqA)>Min(tmp)),SetValue(seqA,Insert({Min(tmp)},seqA,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="1" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="rodB" exp="{Cylinder[((2 * sqrt(3)), -2, -1), ((2 * sqrt(3)), -2, 4), 0.3], Prism[((2 * sqrt(3)) + 2.5, -2 + 2.5, -1), ((2 * sqrt(3)) - 2.5, -2 + 2.5, -1), ((2 * sqrt(3)) - 2.5, -2 - 2.5, -1), ((2 * sqrt(3)) + 2.5, -2 - 2.5, -1), ((2 * sqrt(3)) + 2.5, -2 + 2.5, -0.5)]}" />
<element type="list" label="rodB">
<show object="true" label="false" ev="4"/>
<objColor r="0" g="100" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<ggbscript val="If[tmp=={}&&seqB!={},SetValue(tmpB,Insert(tmpB,{Min(seqB)},1))]
If[tmp=={}&&seqB!={},SetValue(seqB,Remove(seqB,{Min(seqB)}))]

If[tmp!={}&&(seqB=={}||Min(seqB)>Min(tmp))&&tmpB=={},SetValue(moves,moves+1)]
If[tmp!={}&&(seqB=={}||Min(seqB)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqB=={}||Min(seqB)>Min(tmp)),SetValue(seqB,Insert({Min(tmp)},seqB,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="1" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="rodC" exp="{Cylinder[((-2 * sqrt(3)), -2, -1), ((-2 * sqrt(3)), -2, 4), 0.3], Prism[((-2 * sqrt(3)) + 2.5, -2 + 2.5, -1), ((-2 * sqrt(3)) - 2.5, -2 + 2.5, -1), ((-2 * sqrt(3)) - 2.5, -2 - 2.5, -1), ((-2 * sqrt(3)) + 2.5, -2 - 2.5, -1), ((-2 * sqrt(3)) + 2.5, -2 + 2.5, -0.5)]}" />
<element type="list" label="rodC">
<show object="true" label="false" ev="4"/>
<objColor r="220" g="20" b="60" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<ggbscript val="If[tmp=={}&&seqC!={},SetValue(tmpC,Insert(tmpC,{Min(seqC)},1))]
If[tmp=={}&&seqC!={},SetValue(seqC,Remove(seqC,{Min(seqC)}))]

If[tmp!={}&&(seqC=={}||Min(seqC)>Min(tmp))&&tmpC=={},SetValue(moves,moves+1)]
If[tmp!={}&&(seqC=={}||Min(seqC)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqC=={}||Min(seqC)>Min(tmp)),SetValue(seqC,Insert({Min(tmp)},seqC,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="1" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<command name="Sequence">
<input a0="Cylinder[(0, 4, (nA - k - 1) / 2), (0, 4, (nA - k) / 2), (seqA(k) + 1) / 3]" a1="k" a2="nA" a3="1" a4="-1"/>
<output a0="stackA"/>
</command>
<element type="list" label="stackA">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelOffset x="5" y="55"/>
<labelMode val="0"/>
<selectionAllowed val="false"/>
<ggbscript val="If[tmp=={}&&seqA!={},SetValue(tmpA,Insert(tmpA,{Min(seqA)},1))]
If[tmp=={}&&seqA!={},SetValue(seqA,Remove(seqA,{Min(seqA)}))]

If[tmp!={}&&(seqA=={}||Min(seqA)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqA=={}||Min(seqA)>Min(tmp)),SetValue(seqA,Insert({Min(tmp)},seqA,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<command name="Sequence">
<input a0="Cylinder[((2 * sqrt(3)), -2, (nB - k - 1) / 2), ((2 * sqrt(3)), -2, (nB - k) / 2), (seqB(k) + 1) / 3]" a1="k" a2="nB" a3="1" a4="-1"/>
<output a0="stackB"/>
</command>
<element type="list" label="stackB">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<selectionAllowed val="false"/>
<ggbscript val="If[tmp=={}&&seqB!={},SetValue(tmpB,Insert(tmpB,{Min(seqB)},1))]
If[tmp=={}&&seqB!={},SetValue(seqB,Remove(seqB,{Min(seqB)}))]

If[tmp!={}&&(seqB=={}||Min(seqB)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqB=={}||Min(seqB)>Min(tmp)),SetValue(seqB,Insert({Min(tmp)},seqB,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="quadriclimited"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<command name="Sequence">
<input a0="Cylinder[((-2 * sqrt(3)), -2, (nC - k - 1) / 2), ((-2 * sqrt(3)), -2, (nC - k) / 2), (seqC(k) + 1) / 3]" a1="k" a2="nC" a3="1" a4="-1"/>
<output a0="stackC"/>
</command>
<element type="list" label="stackC">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<selectionAllowed val="false"/>
<ggbscript val="If[tmp=={}&&seqC!={},SetValue(tmpC,Insert(tmpC,{Min(seqC)},1))]
If[tmp=={}&&seqC!={},SetValue(seqC,Remove(seqC,{Min(seqC)}))]

If[tmp!={}&&(seqC=={}||Min(seqC)>Min(tmp)),{SetValue(tmpA,{}),SetValue(tmpB,{}),SetValue(tmpC,{})}]
If[tmp!={}&&(seqC=={}||Min(seqC)>Min(tmp)),SetValue(seqC,Insert({Min(tmp)},seqC,1))]

SetValue(tmp,Join(tmpA,tmpB,tmpC))"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<listType val="quadriclimited"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="discA" exp="{Cylinder[(0, 4, 5), (0, 4, 5.5), (tmpA(1) + 1) / 3]}" />
<element type="list" label="discA">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<tooltipMode val="2"/>
<selectionAllowed val="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="discB" exp="{Cylinder[((2 * sqrt(3)), -2, 5), ((2 * sqrt(3)), -2, 5.5), (tmpB(1) + 1) / 3]}" />
<element type="list" label="discB">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<tooltipMode val="2"/>
<selectionAllowed val="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="discC" exp="{Cylinder[((-2 * sqrt(3)), -2, 5), ((-2 * sqrt(3)), -2, 5.5), (tmpC(1) + 1) / 3]}" />
<element type="list" label="discC">
<show object="true" label="false" ev="4"/>
<objColor r="255" g="255" b="0" alpha="1"/>
<layer val="0"/>
<labelMode val="0"/>
<tooltipMode val="2"/>
<selectionAllowed val="false"/>
<lineStyle thickness="5" type="0" typeHidden="1"/>
<pointSize val="5"/>
<pointStyle val="0"/>
<angleStyle val="0"/>
</element>
<expression label="textMoves" exp=""完成 " + n + " 個金盤的河內塔,最少需移動 " + mm + " 次。
The minimal number of moves required to
solve a Tower of Hanoi puzzle with " + n + " disks
is " + mm + " times.

目前,您已經移動了 " + moves + " 次。
Now, You have moved " + moves + " times.

電腦:用滑鼠右鍵拖曳視角
觸控裝置:用兩指拖曳視角
PC: Drag with right-mouse-button to spin
Touch Device: Drag with two-finger to spin"" />
<element type="text" label="textMoves">
<show object="true" label="false" ev="8"/>
<objColor r="0" g="0" b="0" alpha="0"/>
<layer val="6"/>
<labelMode val="0"/>
<fixed val="true"/>
<selectionAllowed val="false"/>
<font serif="false" sizeM="1" size="0" style="1"/>
<absoluteScreenLocation x="38" y="196"/>
</element>
</construction>
</geogebra>