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);
}