Всякий раз, когда у вас есть код Python:
Вызывая ту же функцию, чтобы, если пользователь не выбрал одно из других утверждений, он мог бы попробовать снова, а не программу, чтобы перестать работать,
вам почти всегда лучше заменить рекурсивный вызов циклом. В этом случае рекурсия совершенно не нужна, вероятно, тратит ресурсы и, возможно, затрудняет выполнение кода.
edit: Теперь, когда вы разместили код, я бы рекомендовал преобразовать его в конечный автомат . На следующей странице представлена сводка модулей Python, которые могут быть полезны: ссылка .
Даже без каких-либо дополнительных модулей ваш код поддается простой нерекурсивной перезаписи:
import sys
def function_four():
# Does Stuff
return function_one
def function_three():
# Does Stuff
return function_two
def function_one():
usr_input = input("Options: '1') function_three | '2') Quit\nOption: ")
if usr_input == '1':
return function_three
elif usr_input == '2':
return None
else:
print("Did not recognise command. Try again.")
return function_one
def function_two():
usr_input = input("Options: '1') function_four | '2') function_three | '3') Quit\nOption: ")
if usr_input == '1':
return function_four
elif usr_input == '2':
return function_three
elif usr_input == '3':
return None
else:
print("Did not recognise command. Try again.")
return function_two
state = function_one
while state is not None:
state = state()
Обратите внимание, что функции больше не вызывают друг друга. Вместо этого каждая из них возвращает следующую функцию для вызова, и цикл верхнего уровня заботится о вызове.