斐波那契博弈

来源:互联网 发布:团团子 琵琶 知乎 编辑:程序博客网 时间:2024/05/16 06:01

问题描述:一堆石头,两个人先后拿,谁拿到最后一个石头就赢。拿的过程满足以下两个条件:

1、  先手第一次不能全部拿完;

2、  之后每次拿的个数不能至少为1,至多为对手刚取个数的2倍。

 

当n为Fibonacci数时,先手必败。即存在先手的必败态当且仅当石头个数为Fibonacci数。

证明:利用第二数学归纳法。对Fibonacci数列的项进行归纳,其中n=f(m)

         ① 当m=2时,先手必败。结论成立。

         ② 设m=k时,结论成立。当m=k+1时,有f(k+1)=f(k)+f(k-1)。根据归纳可知,在石头数为f(k)和f(k-1)时,后手必赢。

所以后手只需考虑两个问题,一是能否将石头分为这样两堆(先手一次拿完f(k-1)堆时,后手是否能赢);二是后手在f(k-1)堆最后一次拿时,先手是否可能将f(k)堆一次拿完。

考虑,当先手第一次拿了超过f(k-1)个时,由于2*f(k-1)>f(k-1)+f(k-2)=f(k),故后手可以一次拿完剩下的石头。

当先手一次拿了f(k-1)/3个时,后手可以在f(k-1)堆中拿到最大数目的石头数为2*f(k-1)/3,比较2*f(k-1)/3与f(k)/2的大小,做差知道后者大,故先手不能一次取完f(k)堆。

综上,可知后手可以先在f(k-1)堆取到最后一个是石头,接着又能在f(k)中取到最后一个石头。即当m=k+1时,结论成立。

 

当n不为Fibonacci数时,后手必败。证明,需要用到Zeckendorf定理(齐肯多夫定理):任何正整数都可以表示成不连续的Fibonacci数之和。

         令n=f(a1)+f(a2)+…+f(ap),其中a1+2<=a2,a2+2<=a3,…, a(p-1)+2<=ap

因为有2*f(a1)<f(a1)+f(a1+1)=f(a1+2)<=f(a2),故当先手第一次取f(a1)个石头时,后手面对(n为Fibonacci数,后手先取)比败局。

原创粉丝点击