4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

再帰を用いて基本的な関数をPythonで書いてみたメモ

Last updated at Posted at 2020-02-28

再帰を理解するのに苦労したので自分用にまとめておこうと思い書いたメモです。今後も追加するかもしれません。
言語はPython3です。

再帰関数とは

  • 再帰関数とは、関数の中で自分自身を呼び出すような関数
  • 必ずどこかで終了するように実装しなければならない
  • 大きな問題を小さな問題に分割して解決する分割統治法で使われる手法

1からnまでの和を求める再帰関数

sum.py
def sum(n):
    if n <= 1:
        return n
    return n + sum(n-1)
    
print(sum(100))    # 5050
sum.py
def sum(n):
    res = 0
    if n >= 1:
        res = n + sum(n-1)
    return res

print(sum(100))    # 5050

nの階乗を求める再帰関数

factorical.py
def fractorial(n):
    if n <= 1:
        return n
    return n * fractorial(n-1)
    
print(fractorial(5))    # 120
factorical.py
def factorial(n):
    res = 1
    if n >= 1:
        res = n * factorial(n-1)
    return res
   
print(factorial(5))    # 120

リストの各要素を2倍にしたリストを求める再帰関数

def double_list(lst):
    if lst == []:
        return []
    
    first = lst[0]
    rest = lst[1:]
    
    return [first*2] + double_list(rest)
    
print(double_list([1,2,3]))    # [2, 4, 6]

分かりやすい解説は、こちら

ユークリッドの互除法

euclidean.py
def gcd(m, n):
    r = m % n
    if r == 0:
        return n
    return gcd(n, r)

print(gcd(1071, 1029))   # 21

参考

再帰関数を理解するための最もシンプルな例
[Pythonで理解する再帰関数]
(https://qiita.com/dhirabayashi/items/2f079e62fa2e286f1766)
[Pythonで再帰関数を理解する]
(https://note.com/shimakaze_soft/n/nf17633fe257c)
ループを再帰関数にする考え方

感想

再帰ってなかなかイメージしずらくて今も苦労してます…
コードの見た目はシンプルになる気がするのですが、どう動いているのかを理解するのに時間がかかってしまいます。その点for文はわかりやすいですよね。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?