ホーム     戻る
第10章 再帰

 再帰ricursion:自分自身を呼び出すメソッド

"夢

    
    小舟が一艘 夏空に
  夢見心地にたゆたいて
  ある7月の昼下がり

 
 
不思議の国にまどろみて
 日々のまにまに夢を見る
 逝く夏のように夢を見る

 流れに沿って流されて
 金の光にたゆたいて
 人生、それはただの夢

 (キヤロル)

We are such stuff as dreams are made on,    
And our little life is rounded with a sleep.

 我らみな 夢と同質
 我らの命は 眠りの中
 ( シェイクスピア テンペスト )
Alice in Tokyoより)"

(1)前章の心理テストのaskメソッドのwhileループを再帰で置き換える。

>>> def ask_recursively():
 
       print'q1'
       reply = raw_input('yes かnoでお答えください。>>')
       if reply =='yes':
          True
       elif reply =='no':
          False
       else:
            print '"yes"か"no"でお答え下さい。'
            ask_recursively()

           
>>> ask_recursively()
q1

 yes かnoでお答えください。>>nononon
"yes"か"no"でお答え下さい。
q1
yes かnoでお答えください。>>

 (2)階乗の計算

 >>> def factorial(n) :
           if (n < 0 ) :                
引数が負の値かどうかチエック
              raise 'negativ number error'    文字列エラーを発生させる
           elif (n == 0) or (n ==1) :        引数が0か1であれば
              return 1                 1を返す
           else :
              return n * factorial(n-1)
           引数にn−1を指定して呼び
                                                                         出した
factorial()関数の結果とn
                                                                        の積を計算して値として返す

再帰呼び出しが深くなるに従い、nが1づつ減っていき、最終的にはnが1と等しくなって再帰呼び出しが終了する。

                          
>>> factorial(3)
6
>>> factorial(30)
265252859812191058636308480000000L
>>>

 練習1 再帰を使わないで階乗のプログラムをつくる。
      1からnまでのすべての数字を含むリストをループを処理し繰り返し実行のたびに現在の合計と現在の項目を掛ける. (付録編に答案あり)

ホーム     戻る