程序员的算法趣题:Q23 二十一点通吃(Java版)

题目说明

赌场经典的二十一点游戏中,每回合下注 1 枚硬币,
赢了可以得到 2 枚硬币(+1枚),输了硬币会被收走(-1枚)。
假设最开始只拥有 1 枚硬币,并且每回合下注 1 枚,
那么 4 回合后还能剩余硬币的硬币枚数变化情况如图所示,
共有 6 种(圆形中间的数字代表硬币枚数)
Q23二十一点通吃
求最开始拥有 10 枚硬币时,持续 24 回合后硬币还能剩余的硬币枚数变化情况共有多少种?
题目转化为:
10枚硬币,每次下注1枚。
赢了+1枚,输了-1枚。
硬币输完了则立刻结束游戏。
求:能坚持24轮且还有剩余硬币的情况有多少种?

思路

用递归方法表示一轮下注,记录“硬币数量”“距离成功还剩多少轮”
当硬币数量为0时,表示失败;当剩余轮数为0时,表示成功。
记录失败+成功的总数

代码

public static void main(String[] args) {
    // 10枚硬币,需要持续24轮下注才算成功
    System.out.println(game(10, 24));
}
/**
 * 每调用一次该方法,表示进行了一轮下注。
 * @param coin  剩余硬币数
 * @param depth 还要进行多少轮才算成功
 * @return 有多少种情况
 */
private static int game(int coin, int depth){
    if(coin == 0) return 0;     // 没有硬币了,退出游戏
    if(depth == 0) return 1;    // 成功情况+1

    // 本轮赢了的情况
    int win = game(coin + 1, depth - 1);     // 硬币数量+1,剩余轮数-1

    // 本轮输了的情况
    int lose = game(coin - 1, depth - 1);    // 硬币数量+1,剩余轮数-1

    return win + lose;
}

结果

16051010

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值