Python(再帰recursion)
# 再帰関数
def my_sum(n):
if n == 1:
return 1
else:
return n + my_sum(n-1)
my_sum(10)
def fac(n):
if n == 1:
return 1
else:
return n * fac(n-1)
fac(10)
def fib(n):
if n == 0 or n == 1:
return 1
else:
return fib(n-2)+fib(n-1)
fib(5)
[fib(i) for i in range(20)]
関数の終了条件があり、パターンがあるものは再帰で処理を行うことができます。
サンプルコードとして連続した数の合計sumや階乗の計算fac、フィボナッチ数を求めるfibはforループで処理するよりも再帰を利用することで簡潔に書くことができます。
まずはループで考えて処理がまどろっこしいと感じた場合、再帰が利用できないかどうか考えてみましょう。
書いて慣れるのが一番の習得方法らしいです。
def validate_num(s):
"""<検査関数>有効な数値かどうか検査する関数
@param s 文字列
@return 有効な数値の文字列"""
def err():
raise ValueError
if s == "":
err()
elif s[0] == "-":
validate_num(s[1:])
elif s[0] == "+":
validate_num(s[1:])
elif s.count(".") == 1:
[a,b] = s.split(".")
if not a.isdigit() or not b.isdigit():
err()
return s
elif not s.isdigit():
err()
return s
再帰を活用した検査関数の例です。ifで条件分岐処理させるとネストが深くなりすぎる場合はこのような手法ですっきり書けます。
1.空文字列かどうかで判定
2.先頭に-か+があるかどうかで判定。あれば先頭を除いた文字列で再帰
3.少数点が1つある場合、 少数点部分で文字列を分割(splitメソッド)し、それぞれが数値であるかどうかを判定
4.小数点がなければ数値かどうか判定
※9/19検査関数コードを一部修正
少数点で文字列を分けた後、空かどうかの判定をしていたが、0も空と判定され、0.3などの数値がエラー扱いになってしまうため