多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

关于汉诺塔问题的分析

关于汉诺塔问题的分析 Hanoi汉诺塔问题古代有一个梵塔塔内有3个柱子A、B、C开始时A柱上有64个金盘金盘大小不等大的在下小的在上。有一个老和尚想把这64个金盘从A柱移动到C柱但规定每次只允许移动一个盘且在移动过程中在3个柱上都始终保持大盘在下小盘在上。在移动过程中可以利用B柱。要求编程计算总共需要移动多少次盘子。据说移动完成就是世界的末日。一、提出问题我们先明确一下问题要把n 个盘子从 A 柱移动到 C 柱假设需要的移动次数是f(n)。那我们想知道这个f(n)到底等于多少二、拆分问题直接想 n 个盘子怎么移会比较乱。所以我们把它拆成三步来看。要把 n 个盘子从 A 移到 C最关键的一步是把最底下那个盘子从 A 移到 C。那为了做到这一点需要先做什么第一步把上面n-1 个盘子从 A 移到 B。这一步需要的次数就是f(n-1)。第二步把最底下那个盘子从 A 移到 C。这一步只需要1 次。第三步再把 B 上的n-1 个盘子移到 C。这一步需要的次数同样是f(n-1)。所以总的移动次数就是f(n)f(n−1)1f(n−1)合并一下f(n)2f(n−1)1三、边界条件那 n 等于 1 的时候呢只有一个盘子直接从 A 移到 C所以f(1)1这样我们就有了完整的递推关系f(n)2f(n−1)1, f(1)1四、展开递推写成C语言的代码是long long hanoi_count(int n){if (n 1)return 1;elsereturn 2 * hanoi_count(n - 1) 1;}或者更简洁long long f(int n){return n 1 ? 1 : 2 * f(n - 1) 1;}
返回列表