算法之路(四)—-汉诺塔(又称河内之塔)

Hanoa是复杂而优秀的典范的算法经过。。
河内这是一因为惯例的=mathematics成绩。:
有三个顶点,B,C 。A杆上有N(n>1)镗孔盘。,磁盘的度从下到下逐步减小。。着陆以下问,全部的盘都必要进展到C杆:
* 1 一次只进展一磁盘;
* 2 大盘子不克不及保留在小盘子上。。

准时的:圆盘可以暂时放在B杆上。,经过A杆移除的盘也可以被移回A杆。,但这两条整齐的都必然要恪守。。
问:你怎地进展?你无论以任何方式要去除几次?

3个圆盘的河内进展

4个圆盘的河内进展

惯例

解释这样成绩的最早人是法国=mathematics家爱德华。。
传说印度的一座寺院里有三根柱子。,64金板连续。着陆古风占卜师,寺院里的僧侣们,伸出述整齐的进展盘子;占卜师是在盘子执行后说的,领域将毁灭。这样惯例高水平印度产的牛寺塔的成绩(Towe) of Brahma 使难解)。但我不发生这是卢卡斯结果的演义。,仍他受到他人的照明?。
假定惯例失实,僧侣必要264− 1步可以执行这项任务;假定他们能每秒进展一盘子,必要5849亿年才干执行。。绝对的宇宙现时正是137亿年。
这样惯例有几种种类:寺院、僧侣们代替和尚等。。向寺院的获名次,众说纷纭。,在家一是越南的河内。,因而被命名为“现金炸金花”。并且,金盘是在结果领域的工序中结果摆脱的。、僧侣每天进展一盘子的装置设置。。
佛教中有优美的体型,如浮屠。;有些塔亦秉承上述的整齐的修建的。。“现金炸金花”一名能够是由中南半岛在解决时间传入欧盟的。

譬如,取n=64。,最少必要进展264− 1次。换句话说,假定你能在第二份食物秒内进展一磁盘,它依然必要几亿年。。着陆宇宙大爆炸规律认为,宇宙的年纪正是137亿年。。
在真正的玩意儿中,普通N=8;最少必要进展255次。假定N=10,无论以任何方式1023次去除。假定N=15,无论以任何方式32767次去除;这就是说,假定一人从3岁到99岁,每天进展激光唱片,他至多只进展15个四四方方地。。假定N=20,无论以任何方式1048575次去除,这是宏大的倍前文。。

溶液

receiver 收音机的根本思惟是递推。。万一有A、B、C 三个塔,A塔有N盘,目的是把全部的这些板移到C塔上。。以后进展塔顶的N-1块到B塔。,把塔的其他分得的财产移到C,至死,将B塔的N-1块进展到C。
每回进展一前文磁盘时,以后再次使伸出述算法来进展。。

你是怎地领会的?
我们的能领会。,把A塔上的全部的圆盘移到C塔上,全部的的椎间盘都更低和更大。。这么必然要有一最大磁盘(即N盘)MOVIN的行动。。因而你必然要确保上面的N-1盘都在B塔中。,椎间盘较小。,上面大。当N盘从A移到C时,你必然要把N-1盘从B塔移到C塔。,这项任务执行了。。
又我们的怎样才干把N-1盘在A塔上进展到B塔呢?
在这里必要非常怪想。,你只设想n-1个磁盘。,从A塔进展到B塔(此刻B塔竟是),我们的称A塔为A1塔,B塔是C1爆发,C塔是B1塔,以后,成绩增大以任何方式将N-1盘从A1塔进展到C1。
异样必要将上面的N-2盘从A1塔进展到B1塔。,以后N-1盘从A1塔进展到C1塔。,以后将B-2塔上的N-2盘移到C1塔。
同样地,递推N-2塔…..。

将 B塔 N-1盘,向C塔进展的工序与上述的规律相同的。。

递推解

Objtovi-C假释的应验:

- (void)viewDidLoad {
    [super viewDidLoad];
    int n = 9;
    [self hannoi:n from:@"A" buffer:@"B" to:@"C"];
    NSLog(@"通共 %d 步",伯爵)
}

- (void)hannoi:(int)n from:(NSString *)from buffer:(NSString *)buffer to:(NSString *)to
{
    if (n == 1) {
        NSLog(@"Move disk %d from %@ to %@", n, from, 到)
    } else {
        [self hannoi:n-1 来自某处:来自某处 缓冲: 特大的
        NSLog(@"Move disk %d from %@ to %@", n, from, 到)
        [self hannoi:n-1 来自某处:特大的 特大的:来自某处 到[去]
    }
}

console : 通共 511

用C 假释应验:

usingnamespacestd;
#include #include void hannoi (int n, char from, char buffer, char 到)
{
    if (n == 1) {
        cout << "Move disk " << n << " from " << from << " to " << to << endl;
    } else {
        hannoi (n-1, from, to, 特大的)
        cout << "Move disk " << n << " from " << from << " to " << to << endl;
        hannoi (n-1, buffer, from, 到)
    }
}

int main()
{
    int n;
    cin >> n;
    hannoi (n, A, ''B'', ''C'');
    return0;
}

经过上述的递推工序,HANNOI(n) = 2 * hannoi(n-1) + 1 ,hannoi(n) = 2n-1 + 2n-2 + 2n-3+ …… + 22 + 2 +1。
相当的发展金额的HNNOI(n) = 2n -1。

发表评论

电子邮件地址不会被公开。 必填项已用*标注