【找回数学的感觉】1 再版汉诺塔等

尤其在学过函数式编程之后,更加觉得想在计算机技术上上一个台阶必须得有非常扎实的数学基础。然而太多学生大学开始就慢慢淡忘了数学,和高中比起来根本不是一个境界。于是我决心开设这样一个系列,我每天都会练习,也会更新上博客,也希望大家能够每天练习,毕竟每天都有人推送题目^_^

独立思考是一个非常好的习惯,也希望大家能够拥有它,我虽然会在题目后搭上答案,但肯定不如你通过自己的思考学到的多,而且我写下来的肯定也不如各自思考大脑中想到的多。

第一题

我们的目标是将A中的整个塔移到C中,每次只移动一个圆盘,且较大的圆盘在移动过程中不能放置在较小的圆盘上面。圆盘数量为n。

这问题叫做河内塔问题,也称为汉诺塔。

以上的问题,大家想必都见过了,此处自然不会如此简单。

那么,此处的问题是:将n个圆盘从桩柱A移动到桩柱C,但不允许在A和C之间直接移动,也就是说每一次移动都要移动到中间的桩柱B或从桩柱B移出。求最短的移动序列。

第二题

平面上有n条直接定义的某些区域是无界的,而另一些区域是有界的。有界区域的 最大个数是多少?

如图所示,上过色的地方是有界的。

欢迎大家在评论处展开讨论,随着该系列的继续下去,难度也会慢慢增加的哦。

答案

第一题

T0=0
T1=T0+1+T0+1+T0=2
T2=T1+1+T1+1+T1=8
T3=T2+1+T2+1+T2=26

Tn=3Tn−1+2=3n−1

第二题

Tn=Tn−1+(n−2)
T3=1,T4=3,T5=6,T6=10
Tn=(n−1)(n−2)/2

另外,这个系列取个什么名字好呢?找回数学的感觉?每天一道数学题?数学题系列?大家觉得呢……

时间: 2024-12-31 12:10:02

【找回数学的感觉】1 再版汉诺塔等的相关文章

多柱汉诺塔最优算法设计探究

多柱汉诺塔最优算法设计探究   引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因此多柱汉诺塔的柱子个数M≥3.下面从三柱汉诺塔说起,慢慢深入我们要关心的问题. 1. 三柱汉诺塔 三柱汉诺塔是经典的汉诺塔问题,在算法设计中是递归算法的典型问题.其算法是这样的: 首先把A 柱上面的n- 1 个碟子通过C 柱移到B 柱上[T(n-1)步],然后把A 柱剩下的一个碟子移到C 柱上[1步], 最后把B 柱上所有

【Python学习】Python解决汉诺塔问题

参考文章:http://www.cnblogs.com/dmego/p/5965835.html 一句话:学程序不是目的,理解就好:写代码也不是必然,省事最好:拿也好,查也好,解决问题就好! 信息时代不用信息就是罪过,直接抄不加理解与应用,就不是自己的,下次遇到还是不会,或许其中的某一个细节就能够用于各个问题的解决,共勉 学习一个东西总会遇到一些经典的问题,学习Python第二天尝试看一下汉诺塔问题,还是百度,看看解题思路,纯粹是重温初中课堂,越活越回去了  汉诺塔的图解递归算法 一.起源: 汉

算法-汉诺塔是怎么思考出来的

问题描述 汉诺塔是怎么思考出来的 本人菜鸟,看到这个算法的时候觉得好巧妙,但是自己怎么也想不出来啊... 解决方案 所谓递归,其实人类是做不到的,因为递归嵌套多了,人就乱了,有点像是盗梦空间里的深层梦境limbo,到那就几乎回不到现实了. 但是计算机不像人类想法那么多,尤其是基于过程的设计,你教我怎么走我就怎么走,不会混乱,但是你得给我定个边界条件,要不我还是回不来. 汉诺塔的确是一个经典的递归问题,而人类做的最伟大的一步在于,把f(n)的问题转化为f(n-1),推本溯源,总要找到一个origi

汉诺塔非递归算法实现例子

最近的算法课,讲到了递归与分治策略,书上递归的例子是很经典的汉诺塔问题.问题大意是有三个塔座,分别为a,b,c,开始时塔座a上叠有n个圆盘,这些圆盘自上而下,由小到大地叠放在一起,各圆盘从小到大编号为1到n.要求将塔座a上的圆盘移动到塔座b上,并且在移动时每次只能移动一个圆盘,且每个塔座上的圆盘都必须保持自上而下.由小到大的排列顺序. 本文不涉及对非递归算法的数学性证明,若想理解非递归算法的道理,下面的就不用看啦. 递归的解法就不再说了,这里谈一下非递归的解法.教科书上对于非递归解法是这样描述的

简单的汉诺塔问题解法代码_C 语言

以前学东西不扎实,现在捡捡也好,汉诺塔本是C语言开门就学的东西,不过上课那会儿真心听不懂,直到大二了,才明白那是咋回事,我感觉的编程,真的是一张窗户纸,不过捅破要花时间理解吸收. 题目描述:有一个塔,塔内有A,B,C三个柱子.起初,A柱上有n个盘子,依次由大到小.从下往上堆放,要求将它们全部移到C柱上:在移动过程中可以利用B柱,但每次只能移到一个盘子,且必须使三个柱子上始终保持大盘在下,小盘在上的状态.要求编程输出移动的步骤. 代码如下: 复制代码 代码如下: #include<stdio.h>

C语言递归实现汉诺塔算法

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1) 直接将A柱子上的圆盘从A移动到C else 先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上 直接将A柱子上的第n个圆盘移动到C柱子上 最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 操作系统:ubuntu 编译软件:gcc 结果截

汉诺塔游戏的设计

汉诺塔问题是最经典的递归问题,笔者就该问题设计了这个游戏,由用户交互 游戏和自动演示两部分组成,支持撤销功能.选关.自动完成等功能. 首先 建立了类CMap,该类主要实现用户每一步的操作和画图显示功能,记录的时候只 须记录每组盘子的个数和盘子的矩形.代码和注释如下: //记录 每一步的盘子的情况 class CMap { public: //每组 盘子的个数 int iCount[3]; //3组盘子里面,每个盘子的位 置,用矩形表示 RECT *Rect[3]; //构造函数 CMap() {

UVa 10795 A Different Task:汉诺塔&amp;amp;想法题

10795 - A Different Task Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=456&page=show_problem&problem=1736 The (Three peg) Tower of Hanoi problem is a popular one in computer science

汉诺塔问题的最终解决

问题的提出:约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面. *问题分析与算法设计 这是一个著名的问题,几乎所有的教材上都有这个问题.由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是: 18,446,744,073,709,551,615 这是一个天文数字,若每一微秒可能计算(并不输出)一次