Hãy tưởng tượng bạn bắt đầu ở góc của một X bằng lưới Y. Bạn chỉ có thể di chuyển theo hai hướng: phải và xuống. Có bao nhiêu đường dẫn có thể có để bạn đi từ (0, 0) đến (X, Y)
Tôi có hai cách tiếp cận cho điều này, trước tiên là sử dụng thuật toán đệ quy được tăng cường bằng ghi nhớ, và thuật toán thứ hai là sử dụng chiến lược đếm nhị thức
Recursive Way
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)]
đếm nhị thức
def gridMovingCountByBinomial(x, y):
return int(math.factorial(x + y)/(math.factorial(x) * math.factorial(y)))
hai wa ys cung cấp cho các câu trả lời tương tự khi x và y là tương đối nhỏ
#the same result
print(gridMovingCount(20, 20, cache)) #137846528820
print(gridMovingCountByBinomial(20, 20)) #137846528820
Khi x và y là lớn
# gave different result
print(gridMovingCount(50, 50, cache)) #100891344545564193334812497256
print(gridMovingCountByBinomial(50, 50)) #100891344545564202071714955264
lời giải thích cho điều này là gì. Stack tràn của một số loại? Tuy nhiên, nó không ném bất kỳ ngoại lệ. Có cách nào để khắc phục điều này cho cuộc gọi đệ quy không?
Vấn đề không sinh sản bằng Python 2.6.6 (cả thói quen trả lại * 7256 kết quả), nhưng nó chính xác những gì bạn thể hiện bằng Python 3.5.2 – Prune
đẹp bắt, tôi đã không kiểm tra bằng Python 2.6. 6 –