Я пытаюсь создать решающую программу обратного отсчета из популярного телешоу, которая, учитывая 6 чисел и целевое число, перебирает возможные решения, пока не будет найдено одно, а затем возвращает его.
Я не ищу супер оптимизированная версия, всего лишь простая функция, которую можно было бы легко добавить в более крупную программу (моя конечная цель).
Когда я запускаю свой код, он сообщает, что максимальная глубина рекурсии превышена, и я не уверен, почему.
Я думаю, что он должен запускать только 5 рекурсивных вызовов вместе с 1 или 2 функциями, такими как int(), внутри них.
Может ли кто-нибудь объяснить, почему у меня возникает эта ошибка?
< p>Функция работает (или должна работать) следующим образом:
Список чисел передается в виде строки, и каждая комбинация из 2 чисел объединяется с использованием всех 4 возможных операций (имея в виду a + b = б + а) в цикле for. Это проверяется по целевому значению.
Результат заменяет два числа в исходном списке, чтобы создать список на один элемент меньше. например
Код: Выделить всё
["7","9","50","25","75","100"] => ["63","50","25","75","100"]
Если когда-либо решение будет найдено, строка представление операции возвращается, например. "(7 * 9)".
Из-за рекурсивного характера в этом примере, где сначала было вычислено 63, когда возвращается "(5 + 63)", 63 следует заменить на "(5 + (7) *9))». Это означает, что в конечном итоге возвращается окончательный метод.
Пожалуйста, прокомментируйте, если я не объяснил это должным образом, и я могу попробовать еще раз.
Код: Выделить всё
import itertools as i
target=input("What is the target number? ")
def solve(l):
global count
if len(l) == 2:
count+=1
if int(l[0]) + int(l[1]) == target:
return "("+l[0] +" + "+l[1]+")"
count+=1
if int(l[0]) - int(l[1]) == target:
return "("+l[0] +" - "+l[1]+")"
count+=1
if int(l[0]) * int(l[1]) == target:
return "("+l[0] +" * "+l[1]+")"
count+=1
if int(l[0]) / int(l[1]) == target:
return "("+l[0] +" / "+l[1]+")"
count+=1
if int(l[1]) - int(l[0]) == target:
return "("+l[0] +" - "+l[1]+")"
count+=1
if int(l[1]) / int(l[0]) == target:
return "("+l[1] +" / "+l[0]+")"
else:
return "Q"
else:
ct = list(i.combinations(l, 2))
for item in ct:
count+=1
resulta1=int(item[0])+int(item[1])
if resulta1 == target:
return "("+item[0] +" + "+item[1]+")"
count+=1
resulta2=int(item[0])-int(item[1])
if resulta2 == target:
return "("+item[0] +" - "+item[1]+")"
count+=1
resulta3=int(item[0])*int(item[1])
if resulta3 == target:
return "("+item[0] +" * "+item[1]+")"
count+=1
resulta4=int(item[0])/int(item[1])
if resulta4 == target:
return "("+item[0] +" / "+item[1]+")"
count+=1
resulta5=int(item[1])-int(item[0])
if resulta5 == target:
return "("+item[0] +" - "+item[1]+")"
count+=1
resulta6=int(item[1])+int(item[0])
if resulta6 == target:
return "("+item[1] +" / "+item[0]+")"
intl = [el for el in l]
intl.remove(item[0])
intl.remove(item[1])
newl=intl
newl.append(str(resulta1))
res1=solve(newl)
if res1 != "Q":
return res1.replace(str(resulta1),"("+item[0] +" + "+item[1]+")")
newl=intl
newl.append(str(resulta2))
res2=solve(newl)
if res2 != "Q":
return res2.replace(str(resulta2),"("+item[0] +" - "+item[1]+")")
newl=intl
newl.append(str(resulta3))
res3=solve(newl)
if res3 != "Q":
return res3.replace(str(resulta3),"("+item[0] +" * "+item[1]+")")
newl=intl
newl.append(str(resulta4))
res4=solve(newl)
if res4 != "Q":
return res4.replace(str(resulta4),"("+item[0] +" / "+item[1]+")")
newl=intl
newl.append(str(resulta5))
res5=solve(newl)
if res5 != "Q":
return res5.replace(str(resulta5),"("+item[1] +" - "+item[0]+")")
newl=intl
newl.append(str(resulta6))
res6=solve(newl)
if res6 != "Q":
return res6.replace(str(resulta6),"("+item[1] +" / "+item[0]+")")
else:
return "Q"
lis=input("Enter numbers separated by commas: ").split(",")
count=0
solution = solve(lis)
print(count)
Источник: https://stackoverflow.com/questions/781 ... sion-depth