再帰してる箇所が分かり辛かったのでコメント入れた。