TIL99. アルゴリズム:Recursionの理解


📌 PythonのRecursionの概念と例をまとめた.

🌈 Recursionについて


🔥 Recursionとは?


🔥 Recursionの例


1.Recursionとは?


🤔 再帰関数の概念


次のようになります.
✔したがって、再帰関数は重複文に変換したり、再帰関数に変換したりできるはずです.
✔再帰関数に必要な条件は終了条件です.終了条件のない再帰関数は「RecursionError」を生成します.
✔¥再帰深さにメモリ制限が設けられているため.
def recursive_function():
    print('재귀 함수를 호출합니다.')
    recursive_function()
recursive_function() # RecursionError: maximum recursion depth exceeded while calling a Python object

🤔 再帰関数フィーチャー


АААААААААААААААААААА\
АААААААААААААААААА

🤔 再帰呼び出しと繰り返し文の比較


✔リターンコールは終了条件と点火式のみで実現できるため可読性は高いが、リターンコールの制限により多くのコールが必要な場合に使用できない.
✔¥時間の複雑さでは再帰呼び出しの実現は重複文の実現と変わらないが,実際のコールスタック過程では再帰呼び出し速度が遅く,メモリ消費が大きいという欠点がある.
✔とは逆に,繰返し文実装はプロセス全体を記述するため,コード長が長いが速度が速く,呼び出し制限がないなどの利点がある.
✔祿以下は1からNの和を求める公式で、お互いの特徴を見てみましょう.回帰式は以下の問題を解決することができる.
АЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙ\このように復帰すると、呼び出しが制限されます.
import time
def sumN(n):
  if n == 1: return 1
  return sumN(n-1) + n
start = time.time_ns()
print(sumN(100)) # 5050
print('time :', time.time_ns()-start) # 110982
# print(sumN(998)) # 498501
# print(sumN(999)) # RecursionError: maximum recursion depth exceeded in comparison
✔は繰り返し文で次のように表現されています.コードの読み取り可能性は低いが、重複の制限はない.
import time
def sumN(n):
    res = 1
    for i in range(2, n+1):
        res += i
    return res
start = time.time_ns()    
print(sumN(100)) # 5050
print('time :', time.time_ns()-start) # 44348
print(sumN(998)) # 498501
print(sumN(999)) # 499500
print(sumN(1000)) # 500500
✔nの和を求める公式はガウスの加算です.以下をご参照ください
import time
def sumN(n):
  return n * (n + 1) // 2
start = time.time_ns()    
print(sumN(100)) # 5050
print('time :', time.time_ns()-start) # 32522

2.Recursionの例


🤔 Factorial


✔¥N入力時、!これはN値を返す問題です.
✔▼参考までに数学では0!1!いずれも1であり,時間的複雑度はO(N)であった.
def factorial(n):
  if n <= 1: return 1
  return n * factorial(n-1)
print(factorial(5)) # 120
✔factorial問題は次のように繰り返し解決される.もっと長く.
✔¥時間複雑度は1つforゲートなのでO(N)です.
def factorial(n):
  res = 1
  for i in range(1, n+1):
    res *= i
  return res
print(factorial(5)) # 120

🤔 Fibonacci Number


✔Fibonacci番号は、フィボナッチ数列でN番目のフィボナッチ数を返す問題です.
✔✔勘定科目ここでN番目のFibonacci数は、N-1数とN-2数を加算した値です.
def fibonacci(n):
  if n <= 2: return 1
  return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(1)) # 1
print(fibonacci(2)) # 1
print(fibonacci(3)) # 2
print(fibonacci(4)) # 3
print(fibonacci(5)) # 5
print(fibonacci(6)) # 8
print(fibonacci(7)) # 13
✔」ドアでfibonacci数列を解決し、以下のようにします.n−1,n−2個の数字をa,bに記憶して解決できる.
def fibonacci(n):
  a, b = 1, 1
  if n==1 or n==2:
    return 1
  for i in range(1,n):
    a, b = b, a+b
  return a
print(fibonacci(1)) # 1
print(fibonacci(2)) # 1
print(fibonacci(3)) # 2
print(fibonacci(4)) # 3
print(fibonacci(5)) # 5
print(fibonacci(6)) # 8
print(fibonacci(7)) # 13