コードの出現 1 日目では、何らかの形式で、長い括弧の文字列((((())(())(((()))((
などをループする必要があります。アイデアは、(
1 つの「フロア」を上って、)
1 つのフロアを下って、目的は印刷することです。
- フロア番号が負の文字列の最初のインデックスと、
- 弦の端が見つかったときの最終階。
for ループを使用した必須のソリューションは単純です (例として Python を使用)。
def main():
flr = 0
basement = False
for idx, elt in enumerate(text):
flr += {
"(": 1,
")": -1
}.get(elt)
if flr < 0 and not basement:
print("first basement pos:", idx + 1)
basement = True
print("final floor:", flr)
再帰関数のソリューションはもう少し複雑ですが、それほど難しくはありません。
def worker(flr, txt, idx, basement):
flr += {"(": 1, ")": -1}[ txt[0] ]
if not (len(txt) - 1): return flr
if flr < 0 and not basement:
print("first basement floor index: ", idx + 1)
basement = True
return worker(flr, txt[1:], idx + 1, basement)
def starter(txt):
flr, basement, idx = 0, False, 0
return worker(flr, txt, idx, basement)
if __name__ == '__main__':
__import__("sys").setrecursionlimit(int(1e5))
print("final floor:", starter(text))
これらは両方とも、次の正しい出力を提供します
first basement floor index: 1795
final floor: 74
私のチャレンジ入力に対して実行すると。
Pythonにはテールコールの最適化がないため、2番目のものはダムですが、気にしないでください
これらのいずれかを Factor に実装するにはどうすればよいですか? これは、Factor を使い始めて以来、ずっと混乱していたことです。
for ループだけを使用することはできません。これは、反復間で変更可能な状態を維持できる同等のものがないためです。
再帰的なソリューションを使用できます。
: day-1-starter ( string -- final-floor )
[ 0 ] dip 0 f day-1-worker 3drop "final floor: %s" printf ;
: day-1-worker
( floor string index basement? -- floor string index basement? )
day-1-worker ! what goes here?
; recursive
すばらしい、これは骨格ですが、の体には何が入っていday-1-worker
ますか? Factor には、再帰呼び出しから「早期復帰」する方法がありません。これは、プログラムを逆方向に実行する方法がなく、復帰の概念がないためです。これは意味がありません。
Factor では、再帰はこの質問に対する答えではないのではないかと思います。もしそうなら、どうすれば再帰を止めることができますか?