再帰関数って何?
自分で自分を呼び出すことを再帰的(recursive)と呼び、
再帰的を使って作られた関数を再帰関数と呼びます。
再帰関数で何ができる?
例えば、引数nに5を入れた場合に5+4+3+2+1の合計値が出力できます。
配列やfor文を使わずに合計値を勝手に計算してくれる感じです。
def sum(n):
if n <= 0:
return 0
return n + sum(n-1)
再帰の最大回数
実は最大回数が決まっています。最大回数を超えるとランタイムエラーが出ます。
最大回数を調べる方法、変更する方法は以下です。
import sys
sys.getrecursionlimit() # 取得
sys.setrecursionlimit(3000) # 変更
Mayaで再帰関数をどう使う?
Mayaでは…というよりも、3Dにおけるスケルトン構造のような階層構造がある時に結構使えます。
やりたいこと
ルートから再帰的に下っていき、
親ジョイントに子ジョイントが存在しない場合は親ジョイントを返すことをやってみます。
結果として末端ジョイントだけ得ることができます!
サンプルコード
from maya import cmds
# 階層構造の末端ジョイントを取得する再帰関数
def getEndJoints(root):
end_joints = []
children = cmds.listRelatives(root, c=True, type="joint")
if children is None:
return [root]
for child in children:
end_joints.extend(getEndJoints(child))
return end_joints
end_joints = getEndJoints("root")
cmds.select(end_joints)
処理抜け出せない問題に気をつけよう!
再帰関数はwhile文のように終了条件が必要です。
終了条件がない場合は計算を一生して出られなくなるのでご注意を…!
参考リンク
再帰処理とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
再帰的プログラミングをマスターする – IBM Developer
再帰関数を学ぶと、どんな世界が広がるか – Qiita
おすすめ書籍
Pythonの場合ですが、『なっとくアルゴリズム!』が
わかりやすくておすすめです。
私は再起を学ぶために購入したわけではなく、
ダイクストラ法を学ぶために購入したんですけどね。
再起も含めて、全ての章が図入りでわかりやすく書いてあったのでPythonでいろんなアルゴリズムを知りたい・組みたい方に
おすすめできます。
ソートとか、用意された関数でお手軽にできますが
自分で組むと結構考えさせられるんですよね。
基本情報処理技術者資格の知識の必要性が
徐々にわかってきました。笑
コメント