递归问题之象棋中卒行走路线

一、什么是递归

        首先我们来介绍一下什么是递归,递归就是程序自己调用自己的过程。我们知道一个自定义函数可以调用其余的自定义方法,当这个函数调用其自己的时候即为递归。

二、如何解决递归算法

        我们已经了解了什么是递归,那么自然而然的就会想到如何解,会有什么思路来解此类问题,在此我总结了三个步骤,如下:

1.当n = 1(或n = 2)时会出现哪些情况。

2.寻找第n项与第n - 1项存在的关系。(在此不明白没有关系,下面我会利用该题具体解释)。

3.寻找边界,即特殊情况。

三、小卒路线问题

【问题重述】

有一个小卒从m行n列的网格中要从左上角走到右下角,且每次只走一格,只允许向右或向下移动。问:小卒有几种路线可以走?如下图所示

 1.首先可以发现此时为二元函数的递归问题,与一元的相同,我们先来观察寻找m = 1,n = 1时的情况。

 可以看出只有2种路线。

2.拓展到第m行第n列时,我们可以发现,无论哪一格都与上一个存在两条路线,即第m行第n列与第m - 1行第 n - 1列存在的关系为:

f(m,n) = f(m,n - 1) + f(m - 1,n)

3.接下来我们该考虑边界情况:

当 m = 1时,有n列,那么只有1种路线。

当 n  = 1时,有m行,也只有1种路线。

使用C语言编译运行:

#include<stdio.h>

int Zu(int m,int n){
	if(m == 1) return 1;
	else if(n == 1) return 1;
	else{
		return Zu(m,n - 1) + Zu(m - 1,n);
	} 
}

int main(){
	int n,m;
	scanf("%d %d",&m,&n);
	printf("在%d行%d列的表格中,卒一种有%d种路线可以走",m,n,Zu(m,n));
	return 0;
}

运行效果:

至此,此题大致思路与解法已讲解完毕,如对您有帮助请留下宝贵一赞!如有问题可留言或私信。感谢您的浏览! 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值