博弈论 | 斐波那契博弈

斐波那契博弈

博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论。博弈论是研究互动决策的理论。博弈可以分析自己与对手的利弊关系,从而确立自己在博弈中的优势,因此有不少博弈理论,可以帮助对弈者分析局势,从而采取相应策略,最终达到取胜的目的。

博弈论是研究互动决策的理论,它涉及到两个或多个参与者在平等的对局中利用对方的策略来改变自己的对抗策略,以达到取胜的目标。博弈论可以帮助对弈者分析局势,确定自己在博弈中的优势,并采取相应的策略,最终实现取胜的目的。

博弈论的应用非常广泛,它在经济学、政治学、生物学、计算机科学等领域都有重要的应用。通过博弈论的分析,人们可以更好地理解和预测各种决策情境下的行为和结果,从而做出更明智的决策。

在博弈论中,常见的概念包括博弈的参与者、策略、收益和均衡等。不同的博弈模型和解决方法可以用来研究不同类型的博弈情境,例如零和博弈、合作博弈、非合作博弈等。

总之,博弈论为我们提供了一种分析和理解互动决策的工具,帮助我们在各种情境下制定最优的策略,以实现自己的目标。
两人轮流从一堆物品中取物品,先手最少取一个,至多无上限,但不能把物品取完,之后每次取的物品数不能超过上次取的物品数的二倍且至少为一件,取走最后一件物品的人获胜。

结论:先手胜当且仅当 n 不是斐波那契数(n 为物品总数)。

模拟过程

#include <stdio.h>

int main() {
    int totalItems = 1010; // 初始物品数量
    int currentPlayer = 1; // 当前玩家,1表示先手玩家,2表示后手玩家

    while (totalItems > 0) {
        int maxItems = totalItems; // 每次取的物品数的上限
        int numItems; // 当前玩家取的物品数

        if (currentPlayer == 1) {
            printf("先手玩家,请输入取的物品数(1-%d):", maxItems);
            scanf("%d", &numItems);
        } else {
            printf("后手玩家,请输入取的物品数(1-%d):", maxItems);
            scanf("%d", &numItems);
        }

        // 验证输入的物品数是否合法
        if (numItems < 1 || numItems > maxItems) {
            printf("输入的物品数不合法,请重新输入。\n");
            continue;
        }

        // 更新剩余物品数量
        totalItems -= numItems;

        // 切换玩家
        currentPlayer = (currentPlayer == 1) ? 2 : 1;
    }

    // 最后取走物品的玩家获胜
    int winner = (currentPlayer == 1) ? 2 : 1;
    printf("最后取走物品的玩家是:%d\n", winner);

    return 0;
}

上述代码使用了一个循环来模拟两人轮流取物品的过程。在每一轮中,根据当前玩家的不同,程序会提示玩家输入取的物品数,并进行合法性验证。然后更新剩余物品数量,并切换到下一个玩家。当剩余物品数量为0时,游戏结束,最后取走物品的玩家获胜。

请注意,上述代码只是一个简单的示例,没有包含输入错误处理和边界情况的处理。在实际应用中,可能需要添加更多的代码来处理这些情况。

C++算法实现

#include <iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
const int N=10010;
int f[N];
void Init(){
    f[0]=f[1]=1;
    for(int i=2;i<N;i++){
        f[i]=f[i-1]+f[i-2];
    }
}
int main()
{
    Init();
    int n;
    while(cin>>n){
        if(n==0) break;
        bool flag=0;
        for(int i=0;i<N;i++){
            if(f[i]==N){
                flag=1;
                break;
            }
        }
        if(flag) puts("Second win");
        else puts("First win");
    }
    return 0;
}

在Python中,迭代器(Iterator)是一种对象,它可以用于遍历可迭代对象(Iterable)。可迭代对象是指那些可以被迭代的对象,比如列表、元组、字符串等。

迭代器对象必须实现两个方法:

  1. __iter__():返回迭代器对象自身。该方法在迭代开始之前被调用,用于返回迭代器对象本身。
  2. __next__():返回可迭代对象的下一个值。如果没有下一个值可返回,就会引发StopIteration异常。

通过使用迭代器,我们可以逐个访问可迭代对象的元素,而无需事先获取它们的全部内容。这样可以节省内存空间,并且适用于处理大型数据集。

以下是一个迭代器的示例代码,演示如何自定义一个简单的迭代器来迭代一个列表中的元素:

class MyIterator:
    def __init__(self, iterable):
        self.iterable = iterable
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index < len(self.iterable):
            value = self.iterable[self.index]
            self.index += 1
            return value
        else:
            raise StopIteration

# 创建一个列表
my_list = [1, 2, 3, 4, 5]

# 创建一个迭代器对象
my_iterator = MyIterator(my_list)

# 使用迭代器遍历列表元素
for item in my_iterator:
    print(item)

上述代码定义了一个名为MyIterator的迭代器类,它接受一个可迭代对象作为参数,并实现了__iter____next__方法。通过在迭代器对象上使用for循环,我们可以依次访问列表中的元素,并将其打印出来。

需要注意的是,一旦迭代器对象到达可迭代对象的末尾,再次调用__next__方法将引发StopIteration异常,表示迭代结束。

以下是使用MATLAB实现两人轮流从一堆物品中取物品的代码示例:

totalItems = 10; % 初始物品数量
currentPlayer = 1; % 当前玩家,1表示先手玩家,2表示后手玩家

while totalItems > 0
    maxItems = totalItems; % 每次取的物品数的上限
    
    if currentPlayer == 1
        numItems = input(sprintf('先手玩家,请输入取的物品数(1-%d):', maxItems));
    else
        numItems = input(sprintf('后手玩家,请输入取的物品数(1-%d):', maxItems));
    end
    
    % 验证输入的物品数是否合法
    if numItems < 1 || numItems > maxItems
        disp('输入的物品数不合法,请重新输入。');
        continue;
    end
    
    % 更新剩余物品数量
    totalItems = totalItems - numItems;
    
    % 切换玩家
    currentPlayer = mod(currentPlayer, 2) + 1;
end

% 最后取走物品的玩家获胜
winner = mod(currentPlayer, 2) + 1;
fprintf('最后取走物品的玩家是:%d\n', winner);

上述代码使用了一个循环来模拟两人轮流取物品的过程。在每一轮中,根据当前玩家的不同,程序会提示玩家输入取的物品数,并进行合法性验证。然后更新剩余物品数量,并切换到下一个玩家。当剩余物品数量为0时,游戏结束,最后取走物品的玩家获胜。

请注意,上述代码只是一个简单的示例,没有包含输入错误处理和边界情况的处理。在实际应用中,可能需要添加更多的代码来处理这些情况。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不掉发的小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值