pythonの再帰関数によるgotoまたはlabel機能の実現


c/cppのgotoとjavaのlabelは、指定された文から再実行できる機能であり、プログラムの他の場所から指定された場所にジャンプして実行を再開することができます.pythonでは、実際には元の構文でサポートされていないが、pythonの再帰関数を用いても同様の機能を実現できることを説明する.
たとえば、プログラムがどこかで実行されている場合、いくつかの条件を満たさない場合は、どこかで実行を再開することを望んでいます.この場合、この部分を再実行する必要がある文と条件判断を関数にカプセル化し、その後、行を再帰的に呼び出すことができます.ダミーコードは以下のようになります.
---
some codes
---
#rerun from here
def rerun():
    ---
    some codes
    ---
    if not (some conditions):
        rerun()

このように,再実行が必要な論理および条件判断をrerun関数にカプセル化し,これらのconditionsを満たさなければ,この関数のcodesを再実行しgotoやlabelのような機能を実現できる.
最後に注意すべき点はpythonでは再帰関数の再帰回数に制限があり,この制限回数は異なるマシンによって制限されており,スタックオーバーフローを防止するためsysライブラリのgetrecursionlimit()関数で本マシンの最大再帰回数を取得できることである.したがって,このような制限がプログラムにもたらす可能性のある問題に注意し,再帰回数が多すぎて誤報を防ぐ必要がある.
もちろん、sysライブラリのsysを通過することもできます.setrecursionlimit(maxnum)関数は最大再帰回数をmaxnumに設定します.もちろん、このmaxnumはpython自体の制限を超えてはいけません.しかし、maxnumの値は勝手に小さくできるものではなく、下限があります.もしあなたが設定した回数がこの下限未満であれば、pythonも間違っています.筆者の機械では、40未満ではありません.しかし、再帰回数をあまり多くしたくない場合は、より小さな値を設定したい場合は、再帰するたびに参照が増えるため、関数の参照回数の判断で実現できます.だからsys.getrefcount(rerun)は、rerunの参照回数を取得し、関数に判断文を追加し、参照回数がしきい値を超えるとそのまま返すようにします.