非递归实现
import numpy as np
def walk_nm(N, M):
res = np.zeros([N, M])
for i in range(N):
res[i, 0] = 1
for j in range(M):
res[0, j] = 1
for i in range(N):
for j in range(M):
if i != 0 and j != 0:
res[i,j] = res[i,j-1] + res[i-1, j]
return res[-1, -1]
a = walk_nm(2, 3)
print(a)
递归实现
#为什么判断1,是因为不是数组,所以格子最开始坐标是(1,1)
def walk_nm_i(N, M):
if N == 1 and M == 1:
return 0
elif N == 1 or M == 1:
return 1
else:
return walk_nm_i(N-1, M) + walk_nm_i(N, M-1)
a = walk_nm_i(4, 5)
print(a)
对比下调用非递归的结果
b = walk_nm(4, 5)
print(b)
理论解释参考
【排列组合】给定一个M*N的格子或棋盘,从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离)