[C++][再帰]ハノータ問題


1.テーマ
4147:     (Hanoi)
              
     : 1000ms     : 65535kB
  
 、     

       A,B,C。A   N (N>1)    ,            。              C :           ;           。   :        B ,    A          A ,            。

   :   ?     


 、     

            ·                :         (     )    ,             。                ,                    64   ,         。      ,                    :       ,       ,         。     ,                          ,            ,   、            。

                 ,       64   ,            ,             。         ?         。   n ,     f(n).  f(1)=1,f(2)=3,f(3)=7, f(k+1)=2*f(k)+1。      f(n)=2^n-1。n=64 ,        ,       ?    365  31536000  ,  366  31622400 ,    31556952 ,    : 18446744073709551615             5845.54    ,         45  ,                 。    5845.54  ,         ,          ,    、   ,        。

 、  

            。   A、B、C   ,A  N  ,           C 。    A    N-1     B ,  A        C,   B  N-1    C。           ,            。

  
                  。
        ,              。
  
            。      。
          3:a->b    ,     3    a   b 。
             1, 2, ...n。              1,           n。
    
3 a b c
    
1:a->c
2:a->b
1:c->b
3:a->c
1:b->a
2:b->c
1:a->c

2.コード
#include
#include
#include
using namespace std;
void hanoi(int n,char src,char mid,char des,int ans)
{
    if(n==1)
    {
        cout<"<"<>n>>ch1>>ch2>>ch3;
    hanoi(n,ch1,ch2,ch3,1);
}

3.分析
これは非常に典型的な再帰問題である.詳細な分析を行います:まずn-1つの皿をすべてaからbに運んで、このように最大の皿をcに戻すことができます.
その後、n−1皿をbからcに運ぶ.