ハノイの塔の計算時間についての質問

このQ&Aのポイント
  • ハノイの塔の時間計算量が 2n - 1 になる理由を解説します。
  • ハノイの塔の計算時間を示す式 T(n) = 2T(n-1) + 1 の意味を解説します。
  • ハノイの塔の計算時間を求めるテクニックについて解説します。
回答を見る
  • ベストアンサー

ハノイの塔の計算時間についての質問です。

ハノイの塔の時間計算量が 2n - 1 になるのはなぜかを表したいのですが、どう説明したら解りやすいですか? T(n) = (n段を解く手数) と書くことにすれば T(n) = 2T(n-1) + 1 1. T(n) + 1 = 2{T(n-1) + 1} と変形できること 2. つまり, (1段のときの手数) + 1から順に2倍,2倍,2倍,…されていること 3. そのような規則に従うと, T(n)+1 = (T(1)+1)*2^(n-1) と表せること 4. T(1)=(1段のときの手数)=1 だから T(n)+1=2*2^(n-1) = 2^n 5. 結局, T(n) = 2^n - 1 というのが見つかったのですが、 なぜ1.で+1をするのか。等々わからないことだらけです T(n)を求める時のテクニックでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

Aに積まれている円盤n-1枚を、Cに移す手順をT(n-1) とする。 CからBに移すのもT(n-1)、BからCに移すのにもT(n-1)かかります。 Aに積まれている円盤n枚を、Cに移す手順をT(n) とすると、 すでにCに積まれているn-1枚をBに移すのにT(n-1)、、n枚の一番大きい1枚をCに移すのに1回、 Bに移したn-1枚をCに移すのにT(n-1)かかるので、n枚をCに移すには、2T(n-1)+1回かかります。 T(n)=2T(n-1)+1です。 したがって、 T(n)+1=2{(Tn-1)+1)} ここで、n=2,3,4・・・nとすると、 T(2)+1=2{T(1)+1} T(3)+1=2{T(2)+1} T(4)+1=2{T(3)+1}  ・  ・ T(n-1)+1=2{(T(n-2)+1} T(n)+1=2{T(n-1)+1} で、辺々掛け算して、T(2)+1、T(3)+1、T(4)+1・・・T(n-1)+1で割ると、 T(n+1)+1=2^(n-1){T(1)+1}=2^(n-1)*2=2^n 結局、 T(n)=2^n-1 です。 「T(n)を求める時のテクニックで」す。

その他の回答 (2)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

#2です。 T(n+1)+1=2^(n-1){T(1)+1}=2^(n-1)*2=2^n これミスです。 T(n)+1=2^(n-1){T(1)+1}=2^(n-1)*2=2^n ですね。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.1

T(n) = 2T(n-1) + 1 これを T(n) + a = 2{T(n-1) + a} の形にできそうだから、その形にしたのです。 「できそう」かどうかのひらめき?は、経験によるものでしょうね。 T(n) + a = 2{T(n-1) + a} T(n) + a = 2T(n-1) + 2a T(n) = 2T(n-1) + a なので、a=1 よって、 T(n) + 1 = 2{T(n-1) + 1}

関連するQ&A

  • ハノイの塔

    次のc言語で書かれたハノイの塔のプログラムをZ80で動作させたいのですが、アセンブルするとどうなるのでしょうか??教えてください。 void move(char n,char a,char b){ if(n>1)move(n-1,a,6-a-b); if(n>1)move(n-1,6-a-b,b); } int main(){ char n=5; move(n,1,2); }

  • ハノイの塔について課題が出たのですが、言ってる意味自体解りません(Tへ

    ハノイの塔について課題が出たのですが、言ってる意味自体解りません(TへT) 課題内容は以下のものなんですがぁ;;助けてくださぁ~い↓↓ (1)ハノイの塔の時間計算量が 2n - 1 になるのはなぜか. また,1 枚の円盤を移すのに 2 秒かかるとする. ハノイの塔で,30 枚の円盤を移すのに約何年かかるか求めよ. ただし,1 年を 365 日とする. (2)8 Queen で,しらみつぶし法によってあらゆる置き方を確認するのに何回かかるか求めよ. また,8 Queen で,一行には一つの Queen しか置けないことを考慮した場合のあらゆる置き方を確認するのに何回かかるか求めよ. いずれも,Queen を一個ずつ確認するのではなく,8 個の Queen の置き方一通りについて一回の確認とみなす. 求めた過程も説明すること.

  • CommonLispでハノイの塔の円盤の移動回数を数える。

    はじめまして。東吾と言います。 Lispを最近初めて、色々見ながらハノイの塔のプログラムを作ってみました。 それだけじゃ芸が無いから移動の回数を数えてみようとおもったんだけど、行き詰まってしまいました。 idouの出てきた回数を数えれば良いのは分かるんだけどうまく組みこめないんです。 よろしくお願いします。 とりあえず作ってみたハノイの塔のプログラムです。 (defun hanoi (n from to v) (if (= n 1) (idou 1 from to) (let ((n1 (1- n))) (hanoi n1 from v to) (idou n from to) (hanoi n1 v to from)))) (defun idou (n from to) (print `(move ,n from , from to, to)) )

  • perl ハノイの塔の解に順番付けする方法

    プログラミング初心者です。 サブルーチンを用いて、ハノイの塔の解を求める課題で詰まっています。 解自体は求めることができたのですが、それぞれの解の順番(輪を移動させる順番)を一緒に表示させよという指示が出ており、この方法がわかりません。 表示順に上から番号を振るという考え方でよろしいのでしょうか。 まず考え方自体が違うようであれば、そこから指摘して頂きたいと思います。 よろしくお願いします。 ちなみに現状ではこのようになっております。 #!/usr/bin/perl sub hanoi { my ($no , $x , $y , $z) = @_; if( $no = $no){ hanoi ($no-1,$x,$z,$y); print "Move", $no ,"from" , "$x" , "to" , "$z" , "\n"; hanoi ($no-1,$y,$x,$z); } } print"入力された枚数のハノイの塔の解(順番付き)\n"; $data=<>*1; hanoi($data , "A" , "B" , "C");

  • 数列

    ハノイの塔を授業でやっていて、T(n)=2T(n-1)+1という式が出てきました。 それを等比数列を用いて表せって言われたんですけど、全く検討がつきません・・・。 宜しくお願いします。

  • パズルと数列

    「ハノイの塔」というパズルの最少手数は,円盤が1枚なら1手,2枚なら3手,3枚なら7手,…,n枚なら(2^n)-1手という数列を見いだせます。このように数列が見いだせるパズルを紹介してください。

  • 離散フーリエによる時間計算量

    分割統治法を用いて、N点離散フーリエ変換を計算するとき(高速フーリエ)、その時間計算量T(N)=2T(N/2)+Nを再帰的に代入して次数を下げていくことにより、Nを大きくしたときの漸近的な振る舞いは T(N)=O(Nlog_2 N)となることを示そうと、代入を試みてやってみたのですが、まず T(N)=O(Nlog_2 N)の右辺は何を意味しているのか分からず、またどのようにそれを導けばいいのか検討がつきません。 ヒントを教えてもらえないでしょうか?

  • 数学の簡単な計算ができません。

    4/9+4{1/3-1/(n+2)} 分配をしたらすぐに終わるのは分かるんですが、 先に{}の中を計算するやり方でしたら答えまでたどり着けませんでした。 計算をしていって、 16n-4/9n+18までは持っていくことができたのですが、 答えの形は16/9-4/(n+2)で、その変形ができませんでした。 このやり方での過程を書いてくださいませんでしょうか。 申し訳ありませんが簡単で分かりやすいやり方でお願いします。

  • 2進アルゴリズムの時間計算量

    ベキ乗計算を2進アルゴリズムで解いた場合の時間計算量を求める方法を教えてください。 x^nの時の時間計算量でn=2,3以外の時でn=2p,2p+1の時で場合わけして(pは整数)数学的帰納法で解いてあるのは見た事はあるのですが、どこからその仮定を持ってきたのか見当がつきません。 どうかお願いします。 n>3のときの時間計算量kは k<=(2*log(n))-1 となっていました。

  • 高校数学 指数計算

     変な質問で申し訳ないのですが、下の画像で赤い線を引いている   2^(4n-3) = 2(14+2)^(n-1) という変形は   2^(4n-3) = 2^(4n)・2^(-3)        = (2^4)^n・8^(-1)        = 16^n・2・16^(-1)        = 2・16^(n-1)        = 2(14+2)^(n-1) でいいと思うのですが、これ瞬時にわかるほど簡単な計算ですかね?   (21-2)^n≡(0-2)^n(mod7) のように、それこそ瞬時でわかる変形にはわざわざ注意書きがあるので気になります。