数学归纳法证明双色汉诺塔问题并用C++实现

问题描述

在这里插入图片描述
问题描述的很清楚,我们可以理解成这是一个代编号的汉诺塔问题,编号大的盘子一定大,且编号为偶数的不能相邻排放,编号为奇数的也不能相邻排放。

问题分析

这个问题除了规则三其余规则都和标准汉诺塔一致,问题是要证明Hanoi塔算法不违反规则三。
用数学归纳法。设hanoi(n,A,B,C)是将塔座A上的n个圆盘,以塔座C为辅助塔座,移到目的塔座B上的标准Hanoi塔算法归纳假设:
当圆盘个数小于n时,hanoi(n,A,B,C)不违反规则三,且在移动过程中,目的塔座B上最低圆盘的编号与n具有相同奇偶性,辅助塔座C上的最低圆盘与n具有不同奇偶性当圆盘个数为n时,标准Hanoi塔算法hanoi(n,A,B,C)由以下三个步骤组成:
(1).hanoi(n-1,A,B,C);
(2).move(A,B)
(3),hanoi(n-1,C,B,A)
按归纳假设,步骤(1)不违反规则(3),且在移动过程中,塔座C上最低圆盘的编号与n-1具有相同奇偶性,塔座B上最低圆盘的编号与n-1具有不同奇偶性,从而B塔座上最低圆盘的编号与n具有相同奇偶性,塔座C上最低圆盘的编号与n相同。
步骤(2)也不违反规则三,且塔座B上最低圆盘的编号与n相同。
按照归纳假设,步骤(3)不违反规则三,且在移动过程中,塔座B上倒数第二个圆盘的编号与n-1具有相同奇偶性,塔座A上最低圆盘与n-1具有不同的奇偶性,从而塔座B上倒数第二个圆盘的编号与n具有不同奇偶性,塔座A上最低圆盘与n具有相同奇偶性。因此在移动过程中,塔座B上圆盘不违反规则三,而且塔座B上最低圆盘的编号与n具有相同奇偶性,塔座C上最低圆盘的编号与n具有不同奇偶性。由数学归纳法可知,hanoi(n,A,B,C)不违反规则三。
由于我们的最终目的塔座是在B上的,所以B上的最低圆盘应该就是n,这个没有任何争议,所以倒数第二个和n具有不同的奇偶性
其次如果大家画图的话,可以发现,我们最后是把C上的圆盘借助A移动到B上,我们会将C上的n-2个圆盘,先移动到A上,然后将C上的最后于一个圆盘移动到B上,所以C上的最后一个圆盘与n具有不同奇偶性。但是A上的最低圆盘是n-2,所以它与n具有相同的奇偶性。然后依次移动,再将A上的n-3个盘子移动到C上,然后A再移动到B上,依次类推,我们会发现A的最低圆盘一直与n奇偶性相同,C的最低圆盘始终与n的奇偶性不同。因此上述归纳推理成立。

代码

#include<iostream>
#include <windows.h>
using namespace std;
LARGE_INTEGER frequency;//时间对象
double dff,begin_,_end,time;//时钟频率,起始时间,结束时间,时间差
void Hanoi(int n,char a,char b,char c)
{
    if(n>0)
    {
        Hanoi(n-1,a,c,b);  //将n-1个盘子从A柱移到B柱,C作为过渡柱
        cout << n << a << "->" << c << endl;  //将A柱上剩下的一个直接移到C柱
        Hanoi(n-1,b,a,c);  //将n-1个盘子从B柱移到C柱,A作为过渡柱
    }
}
int main()
{
    int n;
    char a = 'A',b = 'B',c = 'C';
    cout<<"Input a number of disk:";
    cin>>n;
    QueryPerformanceFrequency(&frequency);//获得时钟频率
    dff=(double)frequency.QuadPart;//取得频率
    QueryPerformanceCounter(&frequency);
    begin_=frequency.QuadPart;//获得初始值
    Hanoi(n,a,b,c);
    QueryPerformanceCounter(&frequency);
    _end=frequency.QuadPart;//获得终止值
    time=(_end-begin_)/dff;//差值除以频率得到时间
    cout<<"运行时间为:"<<time*1000<<"ms"<<endl;
    return 0;
}

总结

数学归纳对于算法证明很重要啊,这方面还需要加强。

发布了60 篇原创文章 · 获赞 2 · 访问量 1072

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105445119