正在载入在线练习界面,本页内容可直接阅读…

AK CSP › NOIP 普及 2010 第一轮真题 › 第 26 题

NOIP 普及 2010 第一轮 第 26 题:递归博弈函数的返回值

阅读程序 · 函数与递归 · 答案 1; 4

题目

阅读程序写结果:

#include <iostream>
using namespace std;

const int NUM = 5;

int r(int n)
{
    int i;
    if (n <= NUM)
        return n;
    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;
}

本小题

输入:7
输出:_(4分)

输入:16
输出:_(4分)

答案

1; 4

题解

考点定位

本题考「递归函数模拟」,对应大纲 4.2.3 递归(难度【3】)。

解题过程

r(n):n≤5 返回 n;否则若存在 i∈[1,5] 使 r(n−i)<0 返回 i,全不满足返回 −1。r 返回负只可能……r(n−i)<0 需要 r 返回负值:r(n)=−1 当 n>5 且所有 r(n−i)≥0。

(1) r(7):试 i=1:r(6):i=1:r(5)=5≥0;i=2:r(4)=4≥0;…全 ≥0 → r(6)=−1。故 r(7):r(6)=−1<0 ✓ → 返回 1。

(2) r(16):需要先算 r(11)..r(15):r(6..10)=−1(上面 r(6)=−1;r(7)=1? 重算:r(7) 依赖 r(6)=−1 → r(7)=1 ✓)。r(8):r(7)=1≥0, r(6)=−1<0(i=2)→ r(8)=2。r(9):i=1:r(8)=2;i=2:r(7)=1;i=3:r(6)=−1→ r(9)=3。r(10):i=1:r(9)=3;i=2:r(8)=2;i=3:r(7)=1;i=4:r(6)=−1 → 4。r(11):i=1..5 → r(10)=4,r(9)=3,r(8)=2,r(7)=1,r(6)=−1 → i=5:r(6)=−1<0 → r(11)=5。r(12):r(11)=5,…r(7)=1 全≥0 → −1。r(13):i=1:r(12)=−1 → 1。r(14):i=1:r(13)=1;i=2:r(12)=−1 → 2。r(15):i=3 → r(12)=−1 → 3。r(16):i=4:r(12)=−1 → 4。

答案:(1) 1;(2) 4。

易错提醒

① 递归自底向上记忆化手算,别展开递归树;② −1 是「无法达成」信号,向上传播时第一个发现它的 i 就是答案。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号