Представьте, что вы начинаете на углу Х по Y сетки. Вы можете двигаться только в двух направлениях: вправо и вниз. Сколько возможных путей есть для вас, чтобы перейти от (0, 0) до (X, Y)
У меня есть два подхода к этому, первый заключается в использовании рекурсивного алгоритма усиливается запоминанием, а второй заключается в использовании биномиального СТРАТЕГИЯ подсчета
рекурсивного образом
def gridMovingCount(x, y, cache):
if x == 0 or y == 0:
return 1
elif str(x)+":"+str(y) in cache:
return cache[str(x)+":"+str(y)]
else:
cache[str(x)+":"+str(y)] = gridMovingCount(x-1, y, cache) + gridMovingCount(x, y-1, cache)
return cache[str(x)+":"+str(y)]
биномиальный подсчет
def gridMovingCountByBinomial(x, y):
return int(math.factorial(x + y)/(math.factorial(x) * math.factorial(y)))
этих два в YS дают те же ответы, когда х и у сравнительно небольшой
#the same result
print(gridMovingCount(20, 20, cache)) #137846528820
print(gridMovingCountByBinomial(20, 20)) #137846528820
Когда х и у больших
# gave different result
print(gridMovingCount(50, 50, cache)) #100891344545564193334812497256
print(gridMovingCountByBinomial(50, 50)) #100891344545564202071714955264
Что такое объяснение. Переполнение стека? Однако это не исключает. Есть ли способ преодолеть это для рекурсивного вызова?
Проблема не воспроизводится в Python 2.6.6 (обе процедуры возвращают * 7256 результат), но это именно то, что вы показываете в Python 3.5.2 – Prune
Хороший улов, я не проверял в Python 2.6. 6 –