给定N*M格子,求从左上角走到右下角的走法总数(每次只能往右或往下走一步)python

非递归实现

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的格子或棋盘,从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值