方格运动问题

常见的一个经典问题:

给定一个方格子。另左上角坐标为(0,0),右下角坐标为(M,N),从左上角开始每次只能向右走或者向下走,最后达到右下角的位置。求一共有多少种不同的路径?

数学的想法

对于计算这个问题的时候,可以去思考,不管怎样,从上往下从左往右,一共要走M+N步,那么,只需要去考虑,哪几步朝下,哪几步向右就可以了。运用排列得公式直接写作 C M + N M C_{M+N}^{M} CM+NM或者是 C M + N N C_{M+N}^{N} CM+NN即可。

代码

运用代码来写递归的方式同样可以计算
python代码如下 代码片:

import numpy as np
import pandas as pd

def get_num(i):
    k = input('请输入{},若希望终止请输入 \'False\' :'.format(i))
    k = k.upper()
    if k == 'FALSE':
        return False
    try:
        k=float(k)
    except ValueError as reason:
        print('输入有误,请输入整数值:')
        return get_num(i)
    if k==int(k):
        k=int(k)
    else:
        print('输入有误,您输入的数值为浮点数,请输入整数值')
        return get_num(i)
    return k

def Coordinate_acqu():
    coordinate_name=[['begin_point_X','begin_point_Y'],['end_point_X','end_point_Y']]
    coordinate = np.zeros((2,2)).tolist()
    for point in range(len(coordinate_name)):
        for pointk in range(len(coordinate_name[point])):
            coordinate[point][pointk] = get_num(coordinate_name[point][pointk])
            if coordinate[point][pointk] is False:
                return False
    return coordinate
     

def num_count(begin_point,end_point):   #其实也就只有这个地方的是主要的内容,其他都没什么用
    '''
    func:迭代计算不同路径的总数
    paramter:
    begin_point:起始坐标
    end_point:终止坐标
    return:路径的总数
    '''
    if begin_point[0]>end_point[0] or begin_point[1]>end_point[1]:
        return 0
    if begin_point==end_point:
        return 1
    else:
        return num_count([begin_point[0]+1,begin_point[1]],end_point)+ \
                num_count([begin_point[0],begin_point[1]+1],end_point)

if __name__=='__main__':
    point = Coordinate_acqu()
    if point is False:
        print('输入的内容有误,程序已经终止')
    else:
        [begin_point,end_point]= point
        a ='='*50
        print('\n',a,end='\n\n')
        print('输入的初始坐标为:{}\n输入的终止坐标为:{}'.format(begin_point,end_point))
        num = num_count(begin_point,end_point)
        print('所走的总的不同路径共有 {} 种'.format(num))




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值