LoginSignup
0
1

More than 5 years have passed since last update.

関数を再帰法で引数が配列のときにも対応させる

Last updated at Posted at 2019-04-03

例:2乗を出力する関数(square)

配列に対応していない版

square_1.py
# coding:utf-8

#関数本体
def square(x):
    #シンプルに2乗を計算する
    return x ** 2

#関数を呼び出す
ans = square(2)
print(ans)

配列(リスト)に対応させた版

square_2.py
# coding:utf-8

#関数本体
def square(x):
    if type(x) is list:  #引数がリスト配列のとき
        lsRet = []  #返り値はリスト型配列
        for cnt in range(len(x)):
            #配列の中身を再帰的に関数に渡して、返り値のリストに追加する
            lsRet.append(square(x[cnt]))
        return lsRet
    #引数がリスト配列ではないときはシンプルに計算
    else:
        return x ** 2

#関数を呼び出す
ans1 = square(2)  #引数が数値のとき
print(ans1)  #返り値は数値
#>>4

ans2 = square([2,3,4])  #引数がリスト配列のとき(1次元)
print(ans2)  #返り値は配列となる
#>>[4, 9, 16]

ans3 = square([[[1,2,3],[2,3,4]],[[3,4,5],[4,5,6]]])  #引数が3次元のリスト配列でも対応
print(ans3)
#>>[[[1, 4, 9], [4, 9, 16]], [[9, 16, 25], [16, 25, 36]]]

リストとタプルに対応させた版

square_3.py
# coding:utf-8

#関数本体
def square(x):
    if type(x) in [list,tuple]:  #引数がリストかタプルのとき
        lsRet = []  #返り値はとりあえずリスト配列
        for cnt in range(len(x)):
            lsRet.append(square(x[cnt]))
        return type(x)(lsRet)  #配列の型を維持する
    else:
        return x ** 2

#関数を呼び出す
ans1 = square((2,3,4))  #引数がタプル配列のとき(1次元)
print(ans1)  #返り値はタプルとなる
#>>(4, 9, 16)

ans2 = square([([1,2,3],[2,3,4]),([3,4,5],[4,5,6])])  #リストのタプルのリストの...とかでも対応
print(ans2)
#>>[([1, 4, 9], [4, 9, 16]), ([9, 16, 25], [16, 25, 36])]

まとめ

Pythonらしく書くならイテレータを使った方がいいのかな?
こういう再帰関数の使い方ってありなのかな?
御意見やアドバイスがあればコメントしてください!

0
1
2

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
0
1