@@ -3399,9 +3399,9 @@
< p > 在归并排序和构建二叉树中,我们都是将原问题分解为两个规模为原问题一半的子问题。然而对于汉诺塔问题,我们采用不同的分解策略。< / p >
< div class = "admonition question" >
< p class = "admonition-title" > Question< / p >
< p > 给定三根柱子,记为 < code > A< / code > 、< code > B< / code > 和 < code > C< / code > 。起始状态下,柱子 < code > A< / code > 上套着 < span class = "arithmatex" > \(n\)< / span > 个圆盘,它们从上到下按照从小到大的顺序排列。我们的任务是要把这 < span class = "arithmatex" > \(n\)< / span > 个圆盘移到柱子 < code > C< / code > 上,并保持它们的原有顺序不变。在移动圆盘的过程中,需要遵守以下规则。< / p >
< p > 给定三根柱子,记为 < code > A< / code > 、< code > B< / code > 和 < code > C< / code > 。起始状态下,柱子 < code > A< / code > 上套着 < span class = "arithmatex" > \(n\)< / span > 个圆盘,它们从上到下按照从小到大的顺序排列。我们的任务是要把这 < span class = "arithmatex" > \(n\)< / span > 个圆盘移到柱子 < code > C< / code > 上,并保持它们的原有顺序不变(如图 12-10 所示) 。在移动圆盘的过程中,需要遵守以下规则。< / p >
< ol >
< li > 圆盘只能从一个 柱子顶部拿出,从另一个 柱子顶部放入。< / li >
< li > 圆盘只能从一根 柱子顶部拿出,从另一根 柱子顶部放入。< / li >
< li > 每次只能移动一个圆盘。< / li >
< li > 小圆盘必须时刻位于大圆盘之上。< / li >
< / ol >
@@ -3409,7 +3409,7 @@
< p > < a class = "glightbox" href = "../hanota_problem.assets/hanota_example.png" data-type = "image" data-width = "100%" data-height = "auto" data-desc-position = "bottom" > < img alt = "汉诺塔问题示例" class = "animation-figure" src = "../hanota_problem.assets/hanota_example.png" / > < / a > < / p >
< p align = "center" > 图 12-10 汉诺塔问题示例 < / p >
< p > < strong > 我们将规模为 < span class = "arithmatex" > \(i\)< / span > 的汉诺塔问题记做 < span class = "arithmatex" > \(f(i)\)< / span > < / strong > 。例如 < span class = "arithmatex" > \(f(3)\)< / span > 代表将 < span class = "arithmatex" > \(3\)< / span > 个圆盘从 < code > A< / code > 移动至 < code > C< / code > 的汉诺塔问题。< / p >
< p > < strong > 我们将规模为 < span class = "arithmatex" > \(i\)< / span > 的汉诺塔问题记作 < span class = "arithmatex" > \(f(i)\)< / span > < / strong > 。例如 < span class = "arithmatex" > \(f(3)\)< / span > 代表将 < span class = "arithmatex" > \(3\)< / span > 个圆盘从 < code > A< / code > 移动至 < code > C< / code > 的汉诺塔问题。< / p >
< h3 id = "1" > 1. 考虑基本情况< a class = "headerlink" href = "#1" title = "Permanent link" > ¶ < / a > < / h3 >
< p > 如图 12-11 所示,对于问题 < span class = "arithmatex" > \(f(1)\)< / span > ,即当只有一个圆盘时,我们将它直接从 < code > A< / code > 移动至 < code > C< / code > 即可。< / p >
< div class = "tabbed-set tabbed-alternate" data-tabs = "1:2" > < input checked = "checked" id = "__tabbed_1_1" name = "__tabbed_1" type = "radio" / > < input id = "__tabbed_1_2" name = "__tabbed_1" type = "radio" / > < div class = "tabbed-labels" > < label for = "__tabbed_1_1" > < 1> < / label > < label for = "__tabbed_1_2" > < 2> < / label > < / div >
@@ -3451,11 +3451,11 @@
< p > 解决问题 < span class = "arithmatex" > \(f(2)\)< / span > 的过程可总结为:< strong > 将两个圆盘借助 < code > B< / code > 从 < code > A< / code > 移至 < code > C< / code > < / strong > 。其中,< code > C< / code > 称为目标柱、< code > B< / code > 称为缓冲柱。< / p >
< h3 id = "2" > 2. 子问题分解< a class = "headerlink" href = "#2" title = "Permanent link" > ¶ < / a > < / h3 >
< p > 对于问题 < span class = "arithmatex" > \(f(3)\)< / span > ,即当有三个圆盘时,情况变得稍微复杂了一些。< / p >
< p > 因为已知 < span class = "arithmatex" > \(f(1)\)< / span > 和 < span class = "arithmatex" > \(f(2)\)< / span > 的解,所以我们可从分治角度思考,< strong > 将 < code > A< / code > 顶部的两个圆盘看做 一个整体< / strong > ,执行图 12-13 所示的步骤。这样三个圆盘就被顺利地从 < code > A< / code > 移动 至 < code > C< / code > 了。< / p >
< p > 因为已知 < span class = "arithmatex" > \(f(1)\)< / span > 和 < span class = "arithmatex" > \(f(2)\)< / span > 的解,所以我们可从分治角度思考,< strong > 将 < code > A< / code > 顶部的两个圆盘看作 一个整体< / strong > ,执行图 12-13 所示的步骤。这样三个圆盘就被顺利地从 < code > A< / code > 移至 < code > C< / code > 了。< / p >
< ol >
< li > 令 < code > B< / code > 为目标柱、< code > C< / code > 为缓冲柱,将两个圆盘从 < code > A< / code > 移动 至 < code > B< / code > 。< / li >
< li > 令 < code > B< / code > 为目标柱、< code > C< / code > 为缓冲柱,将两个圆盘从 < code > A< / code > 移至 < code > B< / code > 。< / li >
< li > 将 < code > A< / code > 中剩余的一个圆盘从 < code > A< / code > 直接移动至 < code > C< / code > 。< / li >
< li > 令 < code > C< / code > 为目标柱、< code > A< / code > 为缓冲柱,将两个圆盘从 < code > B< / code > 移动 至 < code > C< / code > 。< / li >
< li > 令 < code > C< / code > 为目标柱、< code > A< / code > 为缓冲柱,将两个圆盘从 < code > B< / code > 移至 < code > C< / code > 。< / li >
< / ol >
< div class = "tabbed-set tabbed-alternate" data-tabs = "3:4" > < input checked = "checked" id = "__tabbed_3_1" name = "__tabbed_3" type = "radio" / > < input id = "__tabbed_3_2" name = "__tabbed_3" type = "radio" / > < input id = "__tabbed_3_3" name = "__tabbed_3" type = "radio" / > < input id = "__tabbed_3_4" name = "__tabbed_3" type = "radio" / > < div class = "tabbed-labels" > < label for = "__tabbed_3_1" > < 1> < / label > < label for = "__tabbed_3_2" > < 2> < / label > < label for = "__tabbed_3_3" > < 3> < / label > < label for = "__tabbed_3_4" > < 4> < / label > < / div >
< div class = "tabbed-content" >
@@ -3475,19 +3475,19 @@
< / div >
< p align = "center" > 图 12-13 规模为 3 问题的解 < / p >
< p > 本质上看,< strong > 我们将问题 < span class = "arithmatex" > \(f(3)\)< / span > 划分为两个子问题 < span class = "arithmatex" > \(f(2)\)< / span > 和子问题 < span class = "arithmatex" > \(f(1)\)< / span > < / strong > 。按顺序解决这三个子问题之后,原问题随之得到解决。这说明子问题是独立的,而且解是 可以合并的 。< / p >
< p > 至此,我们可总结出图 12-14 所示的汉诺塔问题的分治策略:将原问题 < span class = "arithmatex" > \(f(n)\)< / span > 划分为两个子问题 < span class = "arithmatex" > \(f(n-1)\)< / span > 和一个子问题 < span class = "arithmatex" > \(f(1)\)< / span > ,并按照以下顺序解决这三个子问题。< / p >
< p > 从 本质上看,< strong > 我们将问题 < span class = "arithmatex" > \(f(3)\)< / span > 划分为两个子问题 < span class = "arithmatex" > \(f(2)\)< / span > 和子问题 < span class = "arithmatex" > \(f(1)\)< / span > < / strong > 。按顺序解决这三个子问题之后,原问题随之得到解决。这说明子问题是独立的,而且解可以合并。< / p >
< p > 至此,我们可总结出图 12-14 所示的解决 汉诺塔问题的分治策略:将原问题 < span class = "arithmatex" > \(f(n)\)< / span > 划分为两个子问题 < span class = "arithmatex" > \(f(n-1)\)< / span > 和一个子问题 < span class = "arithmatex" > \(f(1)\)< / span > ,并按照以下顺序解决这三个子问题。< / p >
< ol >
< li > 将 < span class = "arithmatex" > \(n-1\)< / span > 个圆盘借助 < code > C< / code > 从 < code > A< / code > 移至 < code > B< / code > 。< / li >
< li > 将剩余 < span class = "arithmatex" > \(1\)< / span > 个圆盘从 < code > A< / code > 直接移至 < code > C< / code > 。< / li >
< li > 将 < span class = "arithmatex" > \(n-1\)< / span > 个圆盘借助 < code > A< / code > 从 < code > B< / code > 移至 < code > C< / code > 。< / li >
< / ol >
< p > 对于这两个子问题 < span class = "arithmatex" > \(f(n-1)\)< / span > , < strong > 可以通过相同的方式进行递归划分< / strong > ,直至达到最小子问题 < span class = "arithmatex" > \(f(1)\)< / span > 。而 < span class = "arithmatex" > \(f(1)\)< / span > 的解是已知的,只需一次移动操作即可。< / p >
< p > < a class = "glightbox" href = "../hanota_problem.assets/hanota_divide_and_conquer.png" data-type = "image" data-width = "100%" data-height = "auto" data-desc-position = "bottom" > < img alt = "汉诺塔问题的分治策略" class = "animation-figure" src = "../hanota_problem.assets/hanota_divide_and_conquer.png" / > < / a > < / p >
< p align = "center" > 图 12-14 汉诺塔问题的分治策略 < / p >
< p > < a class = "glightbox" href = "../hanota_problem.assets/hanota_divide_and_conquer.png" data-type = "image" data-width = "100%" data-height = "auto" data-desc-position = "bottom" > < img alt = "解决 汉诺塔问题的分治策略" class = "animation-figure" src = "../hanota_problem.assets/hanota_divide_and_conquer.png" / > < / a > < / p >
< p align = "center" > 图 12-14 解决 汉诺塔问题的分治策略 < / p >
< h3 id = "3" > 3. 代码实现< a class = "headerlink" href = "#3" title = "Permanent link" > ¶ < / a > < / h3 >
< p > 在代码中,我们声明一个递归函数 < code > dfs(i, src, buf, tar)< / code > ,它的作用是将柱 < code > src< / code > 顶部的 < span class = "arithmatex" > \(i\)< / span > 个圆盘借助缓冲柱 < code > buf< / code > 移动至目标柱 < code > tar< / code > 。 < / p >
< p > 在代码中,我们声明一个递归函数 < code > dfs(i, src, buf, tar)< / code > ,它的作用是将柱 < code > src< / code > 顶部的 < span class = "arithmatex" > \(i\)< / span > 个圆盘借助缓冲柱 < code > buf< / code > 移动至目标柱 < code > tar< / code > : < / p >
< div class = "tabbed-set tabbed-alternate" data-tabs = "4:12" > < input checked = "checked" id = "__tabbed_4_1" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_2" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_3" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_4" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_5" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_6" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_7" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_8" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_9" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_10" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_11" name = "__tabbed_4" type = "radio" / > < input id = "__tabbed_4_12" name = "__tabbed_4" type = "radio" / > < div class = "tabbed-labels" > < label for = "__tabbed_4_1" > Python< / label > < label for = "__tabbed_4_2" > C++< / label > < label for = "__tabbed_4_3" > Java< / label > < label for = "__tabbed_4_4" > C#< / label > < label for = "__tabbed_4_5" > Go< / label > < label for = "__tabbed_4_6" > Swift< / label > < label for = "__tabbed_4_7" > JS< / label > < label for = "__tabbed_4_8" > TS< / label > < label for = "__tabbed_4_9" > Dart< / label > < label for = "__tabbed_4_10" > Rust< / label > < label for = "__tabbed_4_11" > C< / label > < label for = "__tabbed_4_12" > Zig< / label > < / div >
< div class = "tabbed-content" >
< div class = "tabbed-block" >
@@ -3499,7 +3499,7 @@
< a id = "__codelineno-0-6" name = "__codelineno-0-6" href = "#__codelineno-0-6" > < / a > < span class = "n" > tar< / span > < span class = "o" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > pan< / span > < span class = "p" > )< / span >
< a id = "__codelineno-0-7" name = "__codelineno-0-7" href = "#__codelineno-0-7" > < / a >
< a id = "__codelineno-0-8" name = "__codelineno-0-8" href = "#__codelineno-0-8" > < / a > < span class = "k" > def< / span > < span class = "nf" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "p" > :< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span > < span class = "n" > src< / span > < span class = "p" > :< / span > < span class = "nb" > list< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ],< / span > < span class = "n" > buf< / span > < span class = "p" > :< / span > < span class = "nb" > list< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ],< / span > < span class = "n" > tar< / span > < span class = "p" > :< / span > < span class = "nb" > list< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ]):< / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "w" > < / span > < span class = "sd" > " " " 求解汉诺塔: 问题 f(i)" " " < / span >
< a id = "__codelineno-0-9" name = "__codelineno-0-9" href = "#__codelineno-0-9" > < / a > < span class = "w" > < / span > < span class = "sd" > " " " 求解汉诺塔问题 f(i)" " " < / span >
< a id = "__codelineno-0-10" name = "__codelineno-0-10" href = "#__codelineno-0-10" > < / a > < span class = "c1" > # 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-0-11" name = "__codelineno-0-11" href = "#__codelineno-0-11" > < / a > < span class = "k" > if< / span > < span class = "n" > i< / span > < span class = "o" > ==< / span > < span class = "mi" > 1< / span > < span class = "p" > :< / span >
< a id = "__codelineno-0-12" name = "__codelineno-0-12" href = "#__codelineno-0-12" > < / a > < span class = "n" > move< / span > < span class = "p" > (< / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "n" > tar< / span > < span class = "p" > )< / span >
@@ -3512,7 +3512,7 @@
< a id = "__codelineno-0-19" name = "__codelineno-0-19" href = "#__codelineno-0-19" > < / a > < span class = "n" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "n" > tar< / span > < span class = "p" > )< / span >
< a id = "__codelineno-0-20" name = "__codelineno-0-20" href = "#__codelineno-0-20" > < / a >
< a id = "__codelineno-0-21" name = "__codelineno-0-21" href = "#__codelineno-0-21" > < / a > < span class = "k" > def< / span > < span class = "nf" > solve_hanota< / span > < span class = "p" > (< / span > < span class = "n" > A< / span > < span class = "p" > :< / span > < span class = "nb" > list< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ],< / span > < span class = "n" > B< / span > < span class = "p" > :< / span > < span class = "nb" > list< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ],< / span > < span class = "n" > C< / span > < span class = "p" > :< / span > < span class = "nb" > list< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ]):< / span >
< a id = "__codelineno-0-22" name = "__codelineno-0-22" href = "#__codelineno-0-22" > < / a > < span class = "w" > < / span > < span class = "sd" > " " " 求解汉诺塔" " " < / span >
< a id = "__codelineno-0-22" name = "__codelineno-0-22" href = "#__codelineno-0-22" > < / a > < span class = "w" > < / span > < span class = "sd" > " " " 求解汉诺塔问题 " " " < / span >
< a id = "__codelineno-0-23" name = "__codelineno-0-23" href = "#__codelineno-0-23" > < / a > < span class = "n" > n< / span > < span class = "o" > =< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > A< / span > < span class = "p" > )< / span >
< a id = "__codelineno-0-24" name = "__codelineno-0-24" href = "#__codelineno-0-24" > < / a > < span class = "c1" > # 将 A 顶部 n 个圆盘借助 B 移到 C< / span >
< a id = "__codelineno-0-25" name = "__codelineno-0-25" href = "#__codelineno-0-25" > < / a > < span class = "n" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > n< / span > < span class = "p" > ,< / span > < span class = "n" > A< / span > < span class = "p" > ,< / span > < span class = "n" > B< / span > < span class = "p" > ,< / span > < span class = "n" > C< / span > < span class = "p" > )< / span >
@@ -3528,7 +3528,7 @@
< a id = "__codelineno-1-7" name = "__codelineno-1-7" href = "#__codelineno-1-7" > < / a > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > .< / span > < span class = "n" > push_back< / span > < span class = "p" > (< / span > < span class = "n" > pan< / span > < span class = "p" > );< / span >
< a id = "__codelineno-1-8" name = "__codelineno-1-8" href = "#__codelineno-1-8" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-1-9" name = "__codelineno-1-9" href = "#__codelineno-1-9" > < / a >
< a id = "__codelineno-1-10" name = "__codelineno-1-10" href = "#__codelineno-1-10" > < / a > < span class = "cm" > /* 求解汉诺塔: 问题 f(i) */< / span >
< a id = "__codelineno-1-10" name = "__codelineno-1-10" href = "#__codelineno-1-10" > < / a > < span class = "cm" > /* 求解汉诺塔问题 f(i) */< / span >
< a id = "__codelineno-1-11" name = "__codelineno-1-11" href = "#__codelineno-1-11" > < / a > < span class = "kt" > void< / span > < span class = "w" > < / span > < span class = "nf" > dfs< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > i< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > vector< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "o" > & < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > vector< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "o" > & < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > vector< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "o" > & < / span > < span class = "n" > tar< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-1-12" name = "__codelineno-1-12" href = "#__codelineno-1-12" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-1-13" name = "__codelineno-1-13" href = "#__codelineno-1-13" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -3543,7 +3543,7 @@
< a id = "__codelineno-1-22" name = "__codelineno-1-22" href = "#__codelineno-1-22" > < / a > < span class = "w" > < / span > < span class = "n" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > );< / span >
< a id = "__codelineno-1-23" name = "__codelineno-1-23" href = "#__codelineno-1-23" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-1-24" name = "__codelineno-1-24" href = "#__codelineno-1-24" > < / a >
< a id = "__codelineno-1-25" name = "__codelineno-1-25" href = "#__codelineno-1-25" > < / a > < span class = "cm" > /* 求解汉诺塔 */< / span >
< a id = "__codelineno-1-25" name = "__codelineno-1-25" href = "#__codelineno-1-25" > < / a > < span class = "cm" > /* 求解汉诺塔问题 */< / span >
< a id = "__codelineno-1-26" name = "__codelineno-1-26" href = "#__codelineno-1-26" > < / a > < span class = "kt" > void< / span > < span class = "w" > < / span > < span class = "nf" > solveHanota< / span > < span class = "p" > (< / span > < span class = "n" > vector< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "o" > & < / span > < span class = "n" > A< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > vector< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "o" > & < / span > < span class = "n" > B< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > vector< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "o" > & < / span > < span class = "n" > C< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-1-27" name = "__codelineno-1-27" href = "#__codelineno-1-27" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > n< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > A< / span > < span class = "p" > .< / span > < span class = "n" > size< / span > < span class = "p" > ();< / span >
< a id = "__codelineno-1-28" name = "__codelineno-1-28" href = "#__codelineno-1-28" > < / a > < span class = "w" > < / span > < span class = "c1" > // 将 A 顶部 n 个圆盘借助 B 移到 C< / span >
@@ -3560,7 +3560,7 @@
< a id = "__codelineno-2-6" name = "__codelineno-2-6" href = "#__codelineno-2-6" > < / a > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > .< / span > < span class = "na" > add< / span > < span class = "p" > (< / span > < span class = "n" > pan< / span > < span class = "p" > );< / span >
< a id = "__codelineno-2-7" name = "__codelineno-2-7" href = "#__codelineno-2-7" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-2-8" name = "__codelineno-2-8" href = "#__codelineno-2-8" > < / a >
< a id = "__codelineno-2-9" name = "__codelineno-2-9" href = "#__codelineno-2-9" > < / a > < span class = "cm" > /* 求解汉诺塔: 问题 f(i) */< / span >
< a id = "__codelineno-2-9" name = "__codelineno-2-9" href = "#__codelineno-2-9" > < / a > < span class = "cm" > /* 求解汉诺塔问题 f(i) */< / span >
< a id = "__codelineno-2-10" name = "__codelineno-2-10" href = "#__codelineno-2-10" > < / a > < span class = "kt" > void< / span > < span class = "w" > < / span > < span class = "nf" > dfs< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > i< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "n" > Integer< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "n" > Integer< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "n" > Integer< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-2-11" name = "__codelineno-2-11" href = "#__codelineno-2-11" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-2-12" name = "__codelineno-2-12" href = "#__codelineno-2-12" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -3575,7 +3575,7 @@
< a id = "__codelineno-2-21" name = "__codelineno-2-21" href = "#__codelineno-2-21" > < / a > < span class = "w" > < / span > < span class = "n" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > );< / span >
< a id = "__codelineno-2-22" name = "__codelineno-2-22" href = "#__codelineno-2-22" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-2-23" name = "__codelineno-2-23" href = "#__codelineno-2-23" > < / a >
< a id = "__codelineno-2-24" name = "__codelineno-2-24" href = "#__codelineno-2-24" > < / a > < span class = "cm" > /* 求解汉诺塔 */< / span >
< a id = "__codelineno-2-24" name = "__codelineno-2-24" href = "#__codelineno-2-24" > < / a > < span class = "cm" > /* 求解汉诺塔问题 */< / span >
< a id = "__codelineno-2-25" name = "__codelineno-2-25" href = "#__codelineno-2-25" > < / a > < span class = "kt" > void< / span > < span class = "w" > < / span > < span class = "nf" > solveHanota< / span > < span class = "p" > (< / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "n" > Integer< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > A< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "n" > Integer< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > B< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "n" > Integer< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > C< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-2-26" name = "__codelineno-2-26" href = "#__codelineno-2-26" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > n< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > A< / span > < span class = "p" > .< / span > < span class = "na" > size< / span > < span class = "p" > ();< / span >
< a id = "__codelineno-2-27" name = "__codelineno-2-27" href = "#__codelineno-2-27" > < / a > < span class = "w" > < / span > < span class = "c1" > // 将 A 顶部 n 个圆盘借助 B 移到 C< / span >
@@ -3593,7 +3593,7 @@
< a id = "__codelineno-3-7" name = "__codelineno-3-7" href = "#__codelineno-3-7" > < / a > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > .< / span > < span class = "n" > Add< / span > < span class = "p" > (< / span > < span class = "n" > pan< / span > < span class = "p" > );< / span >
< a id = "__codelineno-3-8" name = "__codelineno-3-8" href = "#__codelineno-3-8" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-3-9" name = "__codelineno-3-9" href = "#__codelineno-3-9" > < / a >
< a id = "__codelineno-3-10" name = "__codelineno-3-10" href = "#__codelineno-3-10" > < / a > < span class = "cm" > /* 求解汉诺塔: 问题 f(i) */< / span >
< a id = "__codelineno-3-10" name = "__codelineno-3-10" href = "#__codelineno-3-10" > < / a > < span class = "cm" > /* 求解汉诺塔问题 f(i) */< / span >
< a id = "__codelineno-3-11" name = "__codelineno-3-11" href = "#__codelineno-3-11" > < / a > < span class = "k" > void< / span > < span class = "w" > < / span > < span class = "nf" > DFS< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > i< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-3-12" name = "__codelineno-3-12" href = "#__codelineno-3-12" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-3-13" name = "__codelineno-3-13" href = "#__codelineno-3-13" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "m" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -3608,7 +3608,7 @@
< a id = "__codelineno-3-22" name = "__codelineno-3-22" href = "#__codelineno-3-22" > < / a > < span class = "w" > < / span > < span class = "n" > DFS< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "w" > < / span > < span class = "m" > 1< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > );< / span >
< a id = "__codelineno-3-23" name = "__codelineno-3-23" href = "#__codelineno-3-23" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-3-24" name = "__codelineno-3-24" href = "#__codelineno-3-24" > < / a >
< a id = "__codelineno-3-25" name = "__codelineno-3-25" href = "#__codelineno-3-25" > < / a > < span class = "cm" > /* 求解汉诺塔 */< / span >
< a id = "__codelineno-3-25" name = "__codelineno-3-25" href = "#__codelineno-3-25" > < / a > < span class = "cm" > /* 求解汉诺塔问题 */< / span >
< a id = "__codelineno-3-26" name = "__codelineno-3-26" href = "#__codelineno-3-26" > < / a > < span class = "k" > void< / span > < span class = "w" > < / span > < span class = "nf" > SolveHanota< / span > < span class = "p" > (< / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > A< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > B< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > C< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-3-27" name = "__codelineno-3-27" href = "#__codelineno-3-27" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > n< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > A< / span > < span class = "p" > .< / span > < span class = "n" > Count< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-3-28" name = "__codelineno-3-28" href = "#__codelineno-3-28" > < / a > < span class = "w" > < / span > < span class = "c1" > // 将 A 顶部 n 个圆盘借助 B 移到 C< / span >
@@ -3627,7 +3627,7 @@
< a id = "__codelineno-4-8" name = "__codelineno-4-8" href = "#__codelineno-4-8" > < / a > < span class = "w" > < / span > < span class = "nx" > src< / span > < span class = "p" > .< / span > < span class = "nx" > Remove< / span > < span class = "p" > (< / span > < span class = "nx" > pan< / span > < span class = "p" > )< / span >
< a id = "__codelineno-4-9" name = "__codelineno-4-9" href = "#__codelineno-4-9" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-4-10" name = "__codelineno-4-10" href = "#__codelineno-4-10" > < / a >
< a id = "__codelineno-4-11" name = "__codelineno-4-11" href = "#__codelineno-4-11" > < / a > < span class = "cm" > /* 求解汉诺塔: 问题 f(i) */< / span >
< a id = "__codelineno-4-11" name = "__codelineno-4-11" href = "#__codelineno-4-11" > < / a > < span class = "cm" > /* 求解汉诺塔问题 f(i) */< / span >
< a id = "__codelineno-4-12" name = "__codelineno-4-12" href = "#__codelineno-4-12" > < / a > < span class = "kd" > func< / span > < span class = "w" > < / span > < span class = "nx" > dfsHanota< / span > < span class = "p" > (< / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > tar< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "nx" > list< / span > < span class = "p" > .< / span > < span class = "nx" > List< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-4-13" name = "__codelineno-4-13" href = "#__codelineno-4-13" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-4-14" name = "__codelineno-4-14" href = "#__codelineno-4-14" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -3642,7 +3642,7 @@
< a id = "__codelineno-4-23" name = "__codelineno-4-23" href = "#__codelineno-4-23" > < / a > < span class = "w" > < / span > < span class = "nx" > dfsHanota< / span > < span class = "p" > (< / span > < span class = "nx" > i< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > tar< / span > < span class = "p" > )< / span >
< a id = "__codelineno-4-24" name = "__codelineno-4-24" href = "#__codelineno-4-24" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-4-25" name = "__codelineno-4-25" href = "#__codelineno-4-25" > < / a >
< a id = "__codelineno-4-26" name = "__codelineno-4-26" href = "#__codelineno-4-26" > < / a > < span class = "cm" > /* 求解汉诺塔 */< / span >
< a id = "__codelineno-4-26" name = "__codelineno-4-26" href = "#__codelineno-4-26" > < / a > < span class = "cm" > /* 求解汉诺塔问题 */< / span >
< a id = "__codelineno-4-27" name = "__codelineno-4-27" href = "#__codelineno-4-27" > < / a > < span class = "kd" > func< / span > < span class = "w" > < / span > < span class = "nx" > solveHanota< / span > < span class = "p" > (< / span > < span class = "nx" > A< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > B< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > C< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "nx" > list< / span > < span class = "p" > .< / span > < span class = "nx" > List< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-4-28" name = "__codelineno-4-28" href = "#__codelineno-4-28" > < / a > < span class = "w" > < / span > < span class = "nx" > n< / span > < span class = "w" > < / span > < span class = "o" > :=< / span > < span class = "w" > < / span > < span class = "nx" > A< / span > < span class = "p" > .< / span > < span class = "nx" > Len< / span > < span class = "p" > ()< / span >
< a id = "__codelineno-4-29" name = "__codelineno-4-29" href = "#__codelineno-4-29" > < / a > < span class = "w" > < / span > < span class = "c1" > // 将 A 顶部 n 个圆盘借助 B 移到 C< / span >
@@ -3659,7 +3659,7 @@
< a id = "__codelineno-5-6" name = "__codelineno-5-6" href = "#__codelineno-5-6" > < / a > < span class = "n" > tar< / span > < span class = "p" > .< / span > < span class = "n" > append< / span > < span class = "p" > (< / span > < span class = "n" > pan< / span > < span class = "p" > )< / span >
< a id = "__codelineno-5-7" name = "__codelineno-5-7" href = "#__codelineno-5-7" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-5-8" name = "__codelineno-5-8" href = "#__codelineno-5-8" > < / a >
< a id = "__codelineno-5-9" name = "__codelineno-5-9" href = "#__codelineno-5-9" > < / a > < span class = "cm" > /* 求解汉诺塔: 问题 f(i) */< / span >
< a id = "__codelineno-5-9" name = "__codelineno-5-9" href = "#__codelineno-5-9" > < / a > < span class = "cm" > /* 求解汉诺塔问题 f(i) */< / span >
< a id = "__codelineno-5-10" name = "__codelineno-5-10" href = "#__codelineno-5-10" > < / a > < span class = "kd" > func< / span > < span class = "nf" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "p" > :< / span > < span class = "nb" > Int< / span > < span class = "p" > ,< / span > < span class = "n" > src< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > buf< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > tar< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ])< / span > < span class = "p" > {< / span >
< a id = "__codelineno-5-11" name = "__codelineno-5-11" href = "#__codelineno-5-11" > < / a > < span class = "c1" > // 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-5-12" name = "__codelineno-5-12" href = "#__codelineno-5-12" > < / a > < span class = "k" > if< / span > < span class = "n" > i< / span > < span class = "p" > ==< / span > < span class = "mi" > 1< / span > < span class = "p" > {< / span >
@@ -3674,7 +3674,7 @@
< a id = "__codelineno-5-21" name = "__codelineno-5-21" href = "#__codelineno-5-21" > < / a > < span class = "n" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "p" > :< / span > < span class = "n" > i< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "n" > src< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "n" > buf< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "n" > tar< / span > < span class = "p" > :< / span > < span class = "p" > & < / span > < span class = "n" > tar< / span > < span class = "p" > )< / span >
< a id = "__codelineno-5-22" name = "__codelineno-5-22" href = "#__codelineno-5-22" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-5-23" name = "__codelineno-5-23" href = "#__codelineno-5-23" > < / a >
< a id = "__codelineno-5-24" name = "__codelineno-5-24" href = "#__codelineno-5-24" > < / a > < span class = "cm" > /* 求解汉诺塔 */< / span >
< a id = "__codelineno-5-24" name = "__codelineno-5-24" href = "#__codelineno-5-24" > < / a > < span class = "cm" > /* 求解汉诺塔问题 */< / span >
< a id = "__codelineno-5-25" name = "__codelineno-5-25" href = "#__codelineno-5-25" > < / a > < span class = "kd" > func< / span > < span class = "nf" > solveHanota< / span > < span class = "p" > (< / span > < span class = "n" > A< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > B< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ],< / span > < span class = "n" > C< / span > < span class = "p" > :< / span > < span class = "kr" > inout< / span > < span class = "p" > [< / span > < span class = "nb" > Int< / span > < span class = "p" > ])< / span > < span class = "p" > {< / span >
< a id = "__codelineno-5-26" name = "__codelineno-5-26" href = "#__codelineno-5-26" > < / a > < span class = "kd" > let< / span > < span class = "nv" > n< / span > < span class = "p" > =< / span > < span class = "n" > A< / span > < span class = "p" > .< / span > < span class = "bp" > count< / span >
< a id = "__codelineno-5-27" name = "__codelineno-5-27" href = "#__codelineno-5-27" > < / a > < span class = "c1" > // 列表尾部是柱子顶部< / span >
@@ -3692,7 +3692,7 @@
< a id = "__codelineno-6-6" name = "__codelineno-6-6" href = "#__codelineno-6-6" > < / a > < span class = "w" > < / span > < span class = "nx" > tar< / span > < span class = "p" > .< / span > < span class = "nx" > push< / span > < span class = "p" > (< / span > < span class = "nx" > pan< / span > < span class = "p" > );< / span >
< a id = "__codelineno-6-7" name = "__codelineno-6-7" href = "#__codelineno-6-7" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-6-8" name = "__codelineno-6-8" href = "#__codelineno-6-8" > < / a >
< a id = "__codelineno-6-9" name = "__codelineno-6-9" href = "#__codelineno-6-9" > < / a > < span class = "cm" > /* 求解汉诺塔: 问题 f(i) */< / span >
< a id = "__codelineno-6-9" name = "__codelineno-6-9" href = "#__codelineno-6-9" > < / a > < span class = "cm" > /* 求解汉诺塔问题 f(i) */< / span >
< a id = "__codelineno-6-10" name = "__codelineno-6-10" href = "#__codelineno-6-10" > < / a > < span class = "kd" > function< / span > < span class = "w" > < / span > < span class = "nx" > dfs< / span > < span class = "p" > (< / span > < span class = "nx" > i< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > tar< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-6-11" name = "__codelineno-6-11" href = "#__codelineno-6-11" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-6-12" name = "__codelineno-6-12" href = "#__codelineno-6-12" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "o" > ===< / span > < span class = "w" > < / span > < span class = "mf" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -3707,7 +3707,7 @@
< a id = "__codelineno-6-21" name = "__codelineno-6-21" href = "#__codelineno-6-21" > < / a > < span class = "w" > < / span > < span class = "nx" > dfs< / span > < span class = "p" > (< / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "w" > < / span > < span class = "mf" > 1< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > tar< / span > < span class = "p" > );< / span >
< a id = "__codelineno-6-22" name = "__codelineno-6-22" href = "#__codelineno-6-22" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-6-23" name = "__codelineno-6-23" href = "#__codelineno-6-23" > < / a >
< a id = "__codelineno-6-24" name = "__codelineno-6-24" href = "#__codelineno-6-24" > < / a > < span class = "cm" > /* 求解汉诺塔 */< / span >
< a id = "__codelineno-6-24" name = "__codelineno-6-24" href = "#__codelineno-6-24" > < / a > < span class = "cm" > /* 求解汉诺塔问题 */< / span >
< a id = "__codelineno-6-25" name = "__codelineno-6-25" href = "#__codelineno-6-25" > < / a > < span class = "kd" > function< / span > < span class = "w" > < / span > < span class = "nx" > solveHanota< / span > < span class = "p" > (< / span > < span class = "nx" > A< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > B< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > C< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-6-26" name = "__codelineno-6-26" href = "#__codelineno-6-26" > < / a > < span class = "w" > < / span > < span class = "kd" > const< / span > < span class = "w" > < / span > < span class = "nx" > n< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "nx" > A< / span > < span class = "p" > .< / span > < span class = "nx" > length< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-6-27" name = "__codelineno-6-27" href = "#__codelineno-6-27" > < / a > < span class = "w" > < / span > < span class = "c1" > // 将 A 顶部 n 个圆盘借助 B 移到 C< / span >
@@ -3724,7 +3724,7 @@
< a id = "__codelineno-7-6" name = "__codelineno-7-6" href = "#__codelineno-7-6" > < / a > < span class = "w" > < / span > < span class = "nx" > tar< / span > < span class = "p" > .< / span > < span class = "nx" > push< / span > < span class = "p" > (< / span > < span class = "nx" > pan< / span > < span class = "p" > );< / span >
< a id = "__codelineno-7-7" name = "__codelineno-7-7" href = "#__codelineno-7-7" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-7-8" name = "__codelineno-7-8" href = "#__codelineno-7-8" > < / a >
< a id = "__codelineno-7-9" name = "__codelineno-7-9" href = "#__codelineno-7-9" > < / a > < span class = "cm" > /* 求解汉诺塔: 问题 f(i) */< / span >
< a id = "__codelineno-7-9" name = "__codelineno-7-9" href = "#__codelineno-7-9" > < / a > < span class = "cm" > /* 求解汉诺塔问题 f(i) */< / span >
< a id = "__codelineno-7-10" name = "__codelineno-7-10" href = "#__codelineno-7-10" > < / a > < span class = "kd" > function< / span > < span class = "w" > < / span > < span class = "nx" > dfs< / span > < span class = "p" > (< / span > < span class = "nx" > i< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "kt" > number< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > src< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "kt" > number< / span > < span class = "p" > [],< / span > < span class = "w" > < / span > < span class = "nx" > buf< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "kt" > number< / span > < span class = "p" > [],< / span > < span class = "w" > < / span > < span class = "nx" > tar< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "kt" > number< / span > < span class = "p" > [])< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "ow" > void< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-7-11" name = "__codelineno-7-11" href = "#__codelineno-7-11" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-7-12" name = "__codelineno-7-12" href = "#__codelineno-7-12" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "o" > ===< / span > < span class = "w" > < / span > < span class = "mf" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -3739,7 +3739,7 @@
< a id = "__codelineno-7-21" name = "__codelineno-7-21" href = "#__codelineno-7-21" > < / a > < span class = "w" > < / span > < span class = "nx" > dfs< / span > < span class = "p" > (< / span > < span class = "nx" > i< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "w" > < / span > < span class = "mf" > 1< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "nx" > tar< / span > < span class = "p" > );< / span >
< a id = "__codelineno-7-22" name = "__codelineno-7-22" href = "#__codelineno-7-22" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-7-23" name = "__codelineno-7-23" href = "#__codelineno-7-23" > < / a >
< a id = "__codelineno-7-24" name = "__codelineno-7-24" href = "#__codelineno-7-24" > < / a > < span class = "cm" > /* 求解汉诺塔 */< / span >
< a id = "__codelineno-7-24" name = "__codelineno-7-24" href = "#__codelineno-7-24" > < / a > < span class = "cm" > /* 求解汉诺塔问题 */< / span >
< a id = "__codelineno-7-25" name = "__codelineno-7-25" href = "#__codelineno-7-25" > < / a > < span class = "kd" > function< / span > < span class = "w" > < / span > < span class = "nx" > solveHanota< / span > < span class = "p" > (< / span > < span class = "nx" > A< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "kt" > number< / span > < span class = "p" > [],< / span > < span class = "w" > < / span > < span class = "nx" > B< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "kt" > number< / span > < span class = "p" > [],< / span > < span class = "w" > < / span > < span class = "nx" > C< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "kt" > number< / span > < span class = "p" > [])< / span > < span class = "o" > :< / span > < span class = "w" > < / span > < span class = "ow" > void< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-7-26" name = "__codelineno-7-26" href = "#__codelineno-7-26" > < / a > < span class = "w" > < / span > < span class = "kd" > const< / span > < span class = "w" > < / span > < span class = "nx" > n< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "nx" > A< / span > < span class = "p" > .< / span > < span class = "nx" > length< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-7-27" name = "__codelineno-7-27" href = "#__codelineno-7-27" > < / a > < span class = "w" > < / span > < span class = "c1" > // 将 A 顶部 n 个圆盘借助 B 移到 C< / span >
@@ -3756,7 +3756,7 @@
< a id = "__codelineno-8-6" name = "__codelineno-8-6" href = "#__codelineno-8-6" > < / a > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > .< / span > < span class = "n" > add< / span > < span class = "p" > (< / span > < span class = "n" > pan< / span > < span class = "p" > );< / span >
< a id = "__codelineno-8-7" name = "__codelineno-8-7" href = "#__codelineno-8-7" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-8-8" name = "__codelineno-8-8" href = "#__codelineno-8-8" > < / a >
< a id = "__codelineno-8-9" name = "__codelineno-8-9" href = "#__codelineno-8-9" > < / a > < span class = "cm" > /* 求解汉诺塔: 问题 f(i) */< / span >
< a id = "__codelineno-8-9" name = "__codelineno-8-9" href = "#__codelineno-8-9" > < / a > < span class = "cm" > /* 求解汉诺塔问题 f(i) */< / span >
< a id = "__codelineno-8-10" name = "__codelineno-8-10" href = "#__codelineno-8-10" > < / a > < span class = "kt" > void< / span > < span class = "w" > < / span > < span class = "n" > dfs< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > i< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-8-11" name = "__codelineno-8-11" href = "#__codelineno-8-11" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-8-12" name = "__codelineno-8-12" href = "#__codelineno-8-12" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "m" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -3771,7 +3771,7 @@
< a id = "__codelineno-8-21" name = "__codelineno-8-21" href = "#__codelineno-8-21" > < / a > < span class = "w" > < / span > < span class = "n" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "w" > < / span > < span class = "m" > 1< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > );< / span >
< a id = "__codelineno-8-22" name = "__codelineno-8-22" href = "#__codelineno-8-22" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-8-23" name = "__codelineno-8-23" href = "#__codelineno-8-23" > < / a >
< a id = "__codelineno-8-24" name = "__codelineno-8-24" href = "#__codelineno-8-24" > < / a > < span class = "cm" > /* 求解汉诺塔 */< / span >
< a id = "__codelineno-8-24" name = "__codelineno-8-24" href = "#__codelineno-8-24" > < / a > < span class = "cm" > /* 求解汉诺塔问题 */< / span >
< a id = "__codelineno-8-25" name = "__codelineno-8-25" href = "#__codelineno-8-25" > < / a > < span class = "kt" > void< / span > < span class = "w" > < / span > < span class = "n" > solveHanota< / span > < span class = "p" > (< / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > A< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > B< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > List< / span > < span class = "o" > < < / span > < span class = "kt" > int< / span > < span class = "o" > > < / span > < span class = "w" > < / span > < span class = "n" > C< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-8-26" name = "__codelineno-8-26" href = "#__codelineno-8-26" > < / a > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > n< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > A< / span > < span class = "p" > .< / span > < span class = "n" > length< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-8-27" name = "__codelineno-8-27" href = "#__codelineno-8-27" > < / a > < span class = "w" > < / span > < span class = "c1" > // 将 A 顶部 n 个圆盘借助 B 移到 C< / span >
@@ -3788,7 +3788,7 @@
< a id = "__codelineno-9-6" name = "__codelineno-9-6" href = "#__codelineno-9-6" > < / a > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > .< / span > < span class = "n" > push< / span > < span class = "p" > (< / span > < span class = "n" > pan< / span > < span class = "p" > );< / span >
< a id = "__codelineno-9-7" name = "__codelineno-9-7" href = "#__codelineno-9-7" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-9-8" name = "__codelineno-9-8" href = "#__codelineno-9-8" > < / a >
< a id = "__codelineno-9-9" name = "__codelineno-9-9" href = "#__codelineno-9-9" > < / a > < span class = "cm" > /* 求解汉诺塔: 问题 f(i) */< / span >
< a id = "__codelineno-9-9" name = "__codelineno-9-9" href = "#__codelineno-9-9" > < / a > < span class = "cm" > /* 求解汉诺塔问题 f(i) */< / span >
< a id = "__codelineno-9-10" name = "__codelineno-9-10" href = "#__codelineno-9-10" > < / a > < span class = "k" > fn< / span > < span class = "nf" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > : < span class = "kt" > i32< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > src< / span > : < span class = "kp" > & < / span > < span class = "nc" > mut< / span > < span class = "w" > < / span > < span class = "nb" > Vec< / span > < span class = "o" > < < / span > < span class = "kt" > i32< / span > < span class = "o" > > < / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > buf< / span > : < span class = "kp" > & < / span > < span class = "nc" > mut< / span > < span class = "w" > < / span > < span class = "nb" > Vec< / span > < span class = "o" > < < / span > < span class = "kt" > i32< / span > < span class = "o" > > < / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > tar< / span > : < span class = "kp" > & < / span > < span class = "nc" > mut< / span > < span class = "w" > < / span > < span class = "nb" > Vec< / span > < span class = "o" > < < / span > < span class = "kt" > i32< / span > < span class = "o" > > < / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-9-11" name = "__codelineno-9-11" href = "#__codelineno-9-11" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-9-12" name = "__codelineno-9-12" href = "#__codelineno-9-12" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -3803,7 +3803,7 @@
< a id = "__codelineno-9-21" name = "__codelineno-9-21" href = "#__codelineno-9-21" > < / a > < span class = "w" > < / span > < span class = "n" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > );< / span >
< a id = "__codelineno-9-22" name = "__codelineno-9-22" href = "#__codelineno-9-22" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-9-23" name = "__codelineno-9-23" href = "#__codelineno-9-23" > < / a >
< a id = "__codelineno-9-24" name = "__codelineno-9-24" href = "#__codelineno-9-24" > < / a > < span class = "cm" > /* 求解汉诺塔 */< / span >
< a id = "__codelineno-9-24" name = "__codelineno-9-24" href = "#__codelineno-9-24" > < / a > < span class = "cm" > /* 求解汉诺塔问题 */< / span >
< a id = "__codelineno-9-25" name = "__codelineno-9-25" href = "#__codelineno-9-25" > < / a > < span class = "k" > fn< / span > < span class = "nf" > solve_hanota< / span > < span class = "p" > (< / span > < span class = "n" > A< / span > : < span class = "kp" > & < / span > < span class = "nc" > mut< / span > < span class = "w" > < / span > < span class = "nb" > Vec< / span > < span class = "o" > < < / span > < span class = "kt" > i32< / span > < span class = "o" > > < / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > B< / span > : < span class = "kp" > & < / span > < span class = "nc" > mut< / span > < span class = "w" > < / span > < span class = "nb" > Vec< / span > < span class = "o" > < < / span > < span class = "kt" > i32< / span > < span class = "o" > > < / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > C< / span > : < span class = "kp" > & < / span > < span class = "nc" > mut< / span > < span class = "w" > < / span > < span class = "nb" > Vec< / span > < span class = "o" > < < / span > < span class = "kt" > i32< / span > < span class = "o" > > < / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-9-26" name = "__codelineno-9-26" href = "#__codelineno-9-26" > < / a > < span class = "w" > < / span > < span class = "kd" > let< / span > < span class = "w" > < / span > < span class = "n" > n< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > A< / span > < span class = "p" > .< / span > < span class = "n" > len< / span > < span class = "p" > ()< / span > < span class = "w" > < / span > < span class = "k" > as< / span > < span class = "w" > < / span > < span class = "kt" > i32< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-9-27" name = "__codelineno-9-27" href = "#__codelineno-9-27" > < / a > < span class = "w" > < / span > < span class = "c1" > // 将 A 顶部 n 个圆盘借助 B 移到 C< / span >
@@ -3823,7 +3823,7 @@
< a id = "__codelineno-10-9" name = "__codelineno-10-9" href = "#__codelineno-10-9" > < / a > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > tarSize< / span > < span class = "p" > )< / span > < span class = "o" > ++< / span > < span class = "p" > ;< / span >
< a id = "__codelineno-10-10" name = "__codelineno-10-10" href = "#__codelineno-10-10" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-10-11" name = "__codelineno-10-11" href = "#__codelineno-10-11" > < / a >
< a id = "__codelineno-10-12" name = "__codelineno-10-12" href = "#__codelineno-10-12" > < / a > < span class = "cm" > /* 求解汉诺塔: 问题 f(i) */< / span >
< a id = "__codelineno-10-12" name = "__codelineno-10-12" href = "#__codelineno-10-12" > < / a > < span class = "cm" > /* 求解汉诺塔问题 f(i) */< / span >
< a id = "__codelineno-10-13" name = "__codelineno-10-13" href = "#__codelineno-10-13" > < / a > < span class = "kt" > void< / span > < span class = "w" > < / span > < span class = "nf" > dfs< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "n" > i< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > srcSize< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > bufSize< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > tar< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > tarSize< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-10-14" name = "__codelineno-10-14" href = "#__codelineno-10-14" > < / a > < span class = "w" > < / span > < span class = "c1" > // 若 src 只剩下一个圆盘,则直接将其移到 tar< / span >
< a id = "__codelineno-10-15" name = "__codelineno-10-15" href = "#__codelineno-10-15" > < / a > < span class = "w" > < / span > < span class = "k" > if< / span > < span class = "w" > < / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > ==< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
@@ -3838,7 +3838,7 @@
< a id = "__codelineno-10-24" name = "__codelineno-10-24" href = "#__codelineno-10-24" > < / a > < span class = "w" > < / span > < span class = "n" > dfs< / span > < span class = "p" > (< / span > < span class = "n" > i< / span > < span class = "w" > < / span > < span class = "o" > -< / span > < span class = "w" > < / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > buf< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > bufSize< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > src< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > srcSize< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > tar< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > tarSize< / span > < span class = "p" > );< / span >
< a id = "__codelineno-10-25" name = "__codelineno-10-25" href = "#__codelineno-10-25" > < / a > < span class = "p" > }< / span >
< a id = "__codelineno-10-26" name = "__codelineno-10-26" href = "#__codelineno-10-26" > < / a >
< a id = "__codelineno-10-27" name = "__codelineno-10-27" href = "#__codelineno-10-27" > < / a > < span class = "cm" > /* 求解汉诺塔 */< / span >
< a id = "__codelineno-10-27" name = "__codelineno-10-27" href = "#__codelineno-10-27" > < / a > < span class = "cm" > /* 求解汉诺塔问题 */< / span >
< a id = "__codelineno-10-28" name = "__codelineno-10-28" href = "#__codelineno-10-28" > < / a > < span class = "kt" > void< / span > < span class = "w" > < / span > < span class = "nf" > solveHanota< / span > < span class = "p" > (< / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > A< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > ASize< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > B< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > BSize< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > C< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "kt" > int< / span > < span class = "w" > < / span > < span class = "o" > *< / span > < span class = "n" > CSize< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< a id = "__codelineno-10-29" name = "__codelineno-10-29" href = "#__codelineno-10-29" > < / a > < span class = "w" > < / span > < span class = "c1" > // 将 A 顶部 n 个圆盘借助 B 移到 C< / span >
< a id = "__codelineno-10-30" name = "__codelineno-10-30" href = "#__codelineno-10-30" > < / a > < span class = "w" > < / span > < span class = "n" > dfs< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "n" > ASize< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > A< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > ASize< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > B< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > BSize< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > C< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "n" > CSize< / span > < span class = "p" > );< / span >
@@ -3855,13 +3855,13 @@
< / div >
< / div >
< / div >
< p > 如图 12-15 所示,汉诺塔问题形成一个 高度为 < span class = "arithmatex" > \(n\)< / span > 的递归树,每个节点代表一个子问题、 对应一个开启的 < code > dfs()< / code > 函数,< strong > 因此时间复杂度为 < span class = "arithmatex" > \(O(2^n)\)< / span > ,空间复杂度为 < span class = "arithmatex" > \(O(n)\)< / span > < / strong > 。< / p >
< p > 如图 12-15 所示,汉诺塔问题形成一棵 高度为 < span class = "arithmatex" > \(n\)< / span > 的递归树,每个节点代表一个子问题, 对应一个开启的 < code > dfs()< / code > 函数,< strong > 因此时间复杂度为 < span class = "arithmatex" > \(O(2^n)\)< / span > ,空间复杂度为 < span class = "arithmatex" > \(O(n)\)< / span > < / strong > 。< / p >
< p > < a class = "glightbox" href = "../hanota_problem.assets/hanota_recursive_tree.png" data-type = "image" data-width = "100%" data-height = "auto" data-desc-position = "bottom" > < img alt = "汉诺塔问题的递归树" class = "animation-figure" src = "../hanota_problem.assets/hanota_recursive_tree.png" / > < / a > < / p >
< p align = "center" > 图 12-15 汉诺塔问题的递归树 < / p >
< div class = "admonition quote" >
< p class = "admonition-title" > Quote< / p >
< p > 汉诺塔问题源自一种 古老的传说故事 。在古印度的一个寺庙里,僧侣们有三根高大的钻石柱子,以及 < span class = "arithmatex" > \(64\)< / span > 个大小不一的金圆盘。僧侣们不断地移动原 盘,他们相信在最后一个圆盘被正确放置的那一刻,这个世界就会结束。< / p >
< p > 汉诺塔问题源自一个 古老的传说。在古印度的一个寺庙里,僧侣们有三根高大的钻石柱子,以及 < span class = "arithmatex" > \(64\)< / span > 个大小不一的金圆盘。僧侣们不断地移动圆 盘,他们相信在最后一个圆盘被正确放置的那一刻,这个世界就会结束。< / p >
< p > 然而,即使僧侣们每秒钟移动一次,总共需要大约 < span class = "arithmatex" > \(2^{64} \approx 1.84× 10^{19}\)< / span > 秒,合约 < span class = "arithmatex" > \(5850\)< / span > 亿年,远远超过了现在对宇宙年龄的估计。所以,倘若这个传说是真的,我们应该不需要担心世界末日的到来。< / p >
< / div >