Diary?

2009-06-19
Fri

(16:05)

数日前に「再帰を使ったプログラムはわかりにくいので再帰を使わせません」とか公言してる恥知らずがごく一部でちょっとだけ話題になったけど、実際のところ再帰はわかりにくいと考えている人って結構いるんだよな。まあ別にわからない事それ自体は本人の習熟度とかそれまでのプログラミング経験の問題なんで、その事自体はそこまで問題にはしないけど、そういうのがチームの上の方に居座って強権振るってるとその下はたまったもんじゃないよな。

ところで俺は最近「入れ子になった辞書(マップ or 連想配列)をマージする」という処理が必要になった。大体次のような感じの処理だ。

x = {
    'key1': 1,
    'key2': 2,
    'key3' : {
        'key3-1': 3.1,
    },
}
y = {
    'key1': 1,
    'key3' : {
        'key3-2': 3.2,
    },
    'key4': 4,
}
merge_dict(x, y) # x に無い要素を y からマージ
# 以下の結果が True
x == {
    'key1': 1,
    'key2': 2,
    'key3' : {
        'key3-1': 3.1,
        'key3-2': 3.2,
    },
    'key4': 4,
}

ちなみに Python の辞書の update メソッドは使えない。要素を再帰的に見ていかないので、上の例だと key3 の値が {'key3-2': 3.2} になってしまう。なので専用の処理が必要になったが、この処理を行う merge_dict 関数は再帰を使えば超簡単というか、再帰を使わないと余計な変数の再代入が必要になってそれは全然スマートじゃないよな。

def merge_dict(a, b):
    for k, v in b.iteritems():
        if k in a and isinstance(v, dict) and isinstance(a[k], dict):
            merge_dict(a[k], v)
        else:
            a[k] = v

こういう再帰的なデータ構造が出て来るときって、処理の方も再帰的に書いた方が楽な事って多々あるんだけどねえ。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。