递归 牛吃草问题

133 阅读1分钟

题目

两头牛牛先吃和后吃,每次吃只能吃4的幂的份数,比如0,4,16...,最后一个吃完的牛牛赢,给定草的份数返回先手赢还是后手赢

  • 先写出base case ,当草的份数为0-4时可以逻辑相出答案,之后的数量时,循环先手的情况,吃0,4,16...只要不大于草的份数,然后将剩下的草递归交给后手
  • 主要当先手先吃时,子过程的先手其实是母过程的后手,子过程的后手是母过程的先手
function process(num) {
  if (num < 5) {
    retutn(n === 0 || n === 2) ? "后手" : "先手";
  }
  let base = 1;

  while (base <= num) {
    if (process(n - base) === "后手") {
      return "先手";
    }
    // 防止溢出,比如 num 在 即将溢出的边缘,base*4 就会溢出
    if (base > num / 4) {
      break;
    }
    base = base * 4; // 遍历先手的所有情况
  }

  return "后手"; // 没有返回先手那么就返回后手
}