ホーム     戻る

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

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

 流れに沿って流されて
 金の光にたゆたいて
 人生、それはただの夢
 (キヤロル)

20110923更新


 第10章 再帰とこれまでの復習

 def hello():            <function  identfier:hello:name
    print("hello")

  >>> hello()          < function call
  hello
 >>> res=hello()     <procdure
 hello
 

 >>> print(res)     < return None
 None

>>> print(hello())
hello
None

 def foo():
    return ["xyz",1000000,-98.6]
 def bar ():
    return ("abc",[42,"python"],"guido")

 >>> atuple=bar()           # assignment
 >>> x,y,z = bar()
 >>> (a,b,c) = bar()
 >>> atuple
 ('abc', [42, 'python'], 'guido')
 >>> x,y,z
 ('abc', [42, 'python'], 'guido')
  >>> (a,b,c)
 ('abc', [42, 'python'], 'guido')
  >>> foo()
 ['xyz', 1000000, -98.6]
 >>> a= foo()
 >>> a
 ['xyz', 1000000, -98.6]
  >>> bar()
 ('abc', [42, 'python'], 'guido')
 >>> b= bar()
 >>> b
 ('abc', [42, 'python'], 'guido')
>>>

 
 g関数が内部で自分自身を参照し呼び出すことを「再帰呼び出し」という。再
 帰を使うことでforwhileを使わ ないで繰り返しを実行する。

 def displayーrange(lower,upper):
  while lower <= upper:          < 繰り返し実行するボデイ
   print(lower)
   lower=lower+1        < LOWERのみ+1する

 >>> displayーrange(1,5)
 1
 2
 3
 4
 5

 def displayーrange(lower,upper):
  if lower <= upper :
   print(lower)
   displayーrange(lower + 1,upper)

  
 >>> displayーrange(6,10)
 6
 7
 8
 9
 10

 >>> def fact(n):
      re=n
      for i in range(1,n):
         re *=i
      return re

 >>> fact(1)
 1
 >>> fact(2)
 2
 >>> fact(3)
 6
 >>> fact(4)
 24
 >>> fact(5)
 120

 >>> def fact(n):
  if n==1:
   return 1
  else:
   return n * fact(n-1)

 
 >>> fact(1)
 1
 >>> fact(2)
 2
 >>> fact(3)
 6
 >>> fact(4)
 24
 >>> fact(5)
 120

 >>> def fact(x):
       if x<=1:             再帰条件
           return 1         1を返し再帰は起きない
       return
x*fact(x-1)      fact関数が自分自身を呼び
                                  出す

>>> fact(100)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
>>>


 メソッドの作り方 def 既習
 メソッドの呼び出し方 fact()  既習
  再帰recursion:自分自身を呼び出すメソッドを作る 学習

 再帰の例

 

 階乗

 0! = 1
 n! = n * (n - 1)!

 階乗の定義

 自然数 [n]に対して、 1から[n]までのすべての 自然数を乗じたものを [n]の階乗といい、 [n!]と表す。


 例えば、5の階乗は

 5!=1*2*3*4*5=120

 再帰をつかってプログラムを作る。fact(n-1)

 def fact(n):
     if n == 0: return 1
     return
n * fact(n - 1)
 >>> fact(0)
 1
 >>> fact(1)
 1
 >>> fact(2)
 2
 >>> fact(3)
 6
 >>> fact(4)
 24
 >>>
fact(5)
 120

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

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

  
 >>> ask_recursively()
 q1
 "yes"か"no"でお答えください。>>yes
 >>> ask_recursively()
 q1
 "yes"か"no"でお答えください。>>
no
           
 >>> ask_recursively()
 q1

 再帰呼び出しが終了する。

  >>> def example(n):
            if n > 0:
                 print(n)
                 example(n-1)

  
>>> example(10)
10
9
8
7
6
5
4
3
2
1
 >>> def power(x,n):
           if n==0:
              return 1
           else :
              return x*power(x,n-1)

 >>> power(3,3)
27        
              
 

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

ホーム     戻る