0
点赞
收藏
分享

微信扫一扫

从暴力递归到动态规划

泠之屋 2022-03-26 阅读 70

NOTE: 本文是学习记录篇,会一直更新,目前打算初期题目来源是b站左程云的视频。尽量一天一题吧,因为那边还做着pat的题,白天还要看复试的科目,真是”时到用时方恨少“。


day1 03_26 机器人走路
在这里插入图片描述
简单说就是 有N个位子,机器人初始位置在M,问走K步达到目标位置N有多少种方法。规定在位置1上时只能向右走,在位置N上只能向左走,在中间位置时随便走。

递归方法

思路: 递归两部分 :关系和出口。想知道还剩K步时有多少种走法就需要知道剩K-1步时有多少种走法;要知道剩K-1步时有多少种走法就得知道剩K-2步有多少种走法;…以此类推
关系: 用process(cur,rest,aim,n)表示在cur位置用rest步去到目标位置aim有多少种方法。当在位置n时,下一步可以去位置n-1或者位置n+1,所以在位置n时,去到目标位置的方法就有process(cur-1,rest-1,aim,n) + process(cur+1,rest-1,aim,n)种。
出口: 当剩余步数为0且到达目标位置可以返回1表明此步成功;当剩余步数为0但未到达目标位置则此步失败返回0、当当前位置小于1或大于N,表明当前位置非法,返回0;
然后就可以写代码了。如下:(测试用例是视频里的,可以保证视频出现的测试用例结果是对的)

#include<stdio.h>
int process(int cur, int rest, int aim, int n);

int main() {
	int n = 4;//位子数量
	int start = 2;//开始位置
	int aim = 4;//目标位置
	int k = 4;//步数
	printf("%d",process(start, k, aim, n));

	return 0;
}

//cur当前位置, rest 剩余步数, aim目标位置, n:共有1-n个位置
int process(int cur, int rest, int aim, int n) {
	if(cur == aim && rest== 0)
		return 1;
	if(cur < 1 || cur > n || rest == 0)
		return 0;
	else
		return process(cur-1,rest-1,aim,n) + process(cur+1,rest-1,aim,n);
}
举报

相关推荐

0 条评论