2019年9月24日火曜日

再帰処理とwhileループ


pythonでエディタを作っていて、アウトラインウインドウを標準で実装した
見出し文字は行頭に「.」をつける仕様にしていてこの個数で階層を表現する
最初は階層を三個までに限定していたが、アウトラインの解析ルーチンを見直している内に無制限の階層に対応できるようになった
このテの物は再帰関数を使うモノと思ってたが再帰させなくても実装出来た( ´∀`)

普通はアウトラインで見出しを選んでクリックすれば本文がその行に飛ぶ
逆に、本文中で任意の行を編集中にアウトラインの場所を取得する機能が欲しくなった
そのためにはアウトラインを実装したtreeViewのデータをスキャンする必要があり、ここで悩んだ
階層数を無制限にしたから潜る階層がわからず、結局再帰関数を使って実装した

これが何となく悔しくて、再帰しない方法を考えた

何となくだが、while ループでひたすら潜ることは出来ると思った
で、いろいろ書いてみたがどうもうまくいかない
潜って階層が終わってたら戻って次の子供でまた潜るわけだけど、上の階層のデータをどうやって保持しておくか
基本はリストで子供の都度アペンドしていけばリストの序数が階層になるから、どの階層にいるかさえ変数で保持しておけば上の階層に戻れるはず
しかしややこしくて頭が回らなくなった

で、「再帰 while ループ」で検索したら結構ヒットした
ずばりで、再帰 ⇔ ループ 書換は可能らしく、いくつかの解説サイトが見つかった
でも例示を見ただけで結構難しい
ここら辺はただでさえ可読性が低いから、再帰関数を使った方がまだ読みやすい

出来る「はず」だから頑張って書こうかとも思ったけどちょっと萎えてきた
本文のアウトライン解析は全行スキャンになるが、逆はアウトライン行を調べるだけだからそんなに時間を気にする必要は無い
無論再帰をループ化したところで速くなる保証もないし

再帰でうまく走ってるのならそれでいいのかなと思うようになった
負けたわけですね ┐('д')┌

まあでも良かった
プログラムの道はやはり深くて楽しい
老後は何とかこれを仕事に出来ないかと目論んでいる
私より凄いプログラマは星の数だと思うけど、わかりやすく他人に説明できるかどうかは別問題
そこら辺で何とか仕事にならないかなと・・・
好きなことは仕事にしない主義ではあったが老後はまた別さ~( ´∀`)

=================================

ヒマだったのでこの後もしばらくコードを考えた
いけそうに思えてきたので実験してみたらすんなりいけた (・∀・)ノ
しかし可読性は低い┐('д')┌
速度とかメモリはどうなんだろう?
関数を再帰で何度も呼ぶよりは良いと思うけど
可読性が低いってことは再利用が難しいって事ですよね
ふむ( ̄― ̄?)
もっと考えよう、プログラミングはパズルだよなあ

0 件のコメント:

コメントを投稿