[C++][再帰]ハノータ問題
1787 ワード
1.テーマ
2.コード
3.分析
これは非常に典型的な再帰問題である.詳細な分析を行います:まずn-1つの皿をすべてaからbに運んで、このように最大の皿をcに戻すことができます.
その後、n−1皿をbからcに運ぶ.
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に運ぶ.