2
5

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の再帰関数における出力パターン4つ

Last updated at Posted at 2021-04-24

#はじめに
はじめて記事を書かせていただきます。
趣味で競プロをしている初心者プログラマです。
お見苦しい点などあるかと思いますがよろしくお願いいたします。

#きっかけ
競技プログラミングの勉強をしていて再帰関数というものに出くわしました。
自身を呼び出すという構造はなんとか理解しはじめているのですが、回数や総数をカウントして出力する方法がうまく咀嚼できませんでした。

#やったこと
検索してみるといくつか方法があるようで、人によって使いやすいものが異なるようです。
そこで調べて見つけた4つのパターンを整理のためにまとめてみました。

例として、1からnまでの総和を考えます。

※この記事をはじめて投稿した際に例が特殊でわかりづらいとのコメントを頂きました。
 一度削除して修正したものとなります。ご指摘ありがとうございました。

※2021/4/26
 コメントにて各コードの短所ならびにもっと簡潔な書き方のご教示を頂きました。
悪い例示と自戒の意味もこめてコードの修正は初投稿からしておりません。
コメントありがとうございました。

#環境
Python 3.7.9

#パターン1:関数を戻り値とする

def saiki(n):
    if n == 1:
        return n
    return saiki(n-1) + n

print(saiki(10))#55が表示される。

#パターン2:関数内で変数(ここではcnt)を定義して戻り値とする

def saiki_cnt(n):
    if n == 1:
        return n
    cnt = 0
    cnt += saiki_cnt(n-1) + n
    return cnt

print(saiki_cnt(10))#55が表示される。

#パターン3:カウンターとなる引数を与える

def saiki_arg_cnt(n, cnt):
    if n == 1:
        return cnt + n  
    return saiki_arg_cnt(n-1, cnt+n)

print(saiki_arg_cnt(10,0))#55が表示される。

#パターン4:グローバル変数でインクリメントする

cnt = 0
def saiki_global_cnt(n):
    global cnt
    cnt += n
    if n == 1:
        return
    saiki_global_cnt(n-1)

saiki_global_cnt(10)
print(cnt)#55が表示される。

#所感
個人的にはパターン4のグローバル変数を使う方法が比較的わかりやすかったです。
答えとして別に変数を用意するというのが私にとって直感的なのだと思います。

間違いや改善点などあればご指摘いただけると幸いです。

2
5
1

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
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?