NOIP 提高组初赛 · NOIP 2010 提高组初赛试题 第 26 题

选择题 · 答案 4 · 考点:递归函数

← 整套速查表 NOIP 提高组初赛 全部真题

题目

#include<iostream>
using namespace std;
const int NUM=5;
int r(int n)
{
    int i;
    if(n<=NUM)
       return 0;
    for(i=1;i<=NUM;i++)
       if( r(n-i)<0)
          return i;
    return -1;
}

int main()
{
    int n;
    cin>>n;
    cout<<r(n)<<endl;
    return 0;
}

输入: 16 输出:______________

答案:4

考点

递归函数

解题思维

博弈题:找最小必胜走法,r(16)=4 表示取 4 个能赢。

常见错误

递归函数判断对手是否处于必败局面;当前局面有必败后继则必胜。

详细解析(节选)

程序阅读——博弈递归

函数r(n):

n=16: r(15)→取1→r(14)→取1→...→r(10)→取1→r(9)→取1→r(8)→取1→r(7)→取1→r(6)→取1→r(5)=0

实际上:r(6)时取1后r(5)=0,所以r(6)=1 r(7)取2后r(5)=0,r(7)=2 ... 当n=16时,取4后r(12)=...追踪可得r(16)=4

输出:4

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断