蓝桥杯—OJ760数的计算问题(递归-递推算法)

目录

题目描述

我们要求找出具有下列性质数的个数(包含输入的正整数 n)。

详细分析递归过程

总结每次递归调用的计数器变化


题目描述


我们要求找出具有下列性质数的个数(包含输入的正整数 n)。

先输入一个正整数 n(n≤1000),然后对此正整数按照如下方法进行处理:

1、不作任何处理;

2、在它的左边加上一个正整数,但该正整数不能超过原数的一半;

3、加上数后,继续按此规则进行处理,直到不能再加正整数为止。

输入格式
1 个正整数 n(n≤1000)

输出格式
1 个整数,表示具有该性质数的个数。

输入输出样例
输入 

6

输出 

6

答案:

#include <bits/stdc++.h>
using namespace std;

int ans = 0; // 初始化操作次数计数器
int n;

void dfs(int n) {
    if(n == 0) {
        return; // 当 n 为 0 时,结束当前递归调用
    } else {
        // 对 n 的一半及以下的每个值进行递归调用
        for(int i = 0; i <= n / 2; i++) {
            dfs(i); // 对 i 进行递归调用
        }
    }
    ans++; // 每次递归调用结束后,计数器加1
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n; // 读取输入值 n
    dfs(n); // 调用 dfs 函数
    cout << ans; // 输出最终计数结果
    return 0;
}

详细分析递归过程

我们以 n = 6 为例,分析整个递归过程。

  1. 初始调用

    • 调用 dfs(6),进入递归函数:
      • n 不为 0,进入 else 分支。
  2. 处理 dfs(6)

    • 对 i = 0 到 3(即 6 / 2)进行递归调用:
      • 调用 dfs(0)返回
      • 调用 dfs(1),进入 dfs(1)
        • 对 i = 0 进行递归调用:
          • 调用 dfs(0)返回
        • dfs(1) 递归结束,ans++
      • 调用 dfs(2),进入 dfs(2)
        • 对 i = 0 到 1 进行递归调用:
          • 调用 dfs(0)返回
          • 调用 dfs(1),进入 dfs(1)
            • 对 i = 0 进行递归调用:
              • 调用 dfs(0)返回
            • dfs(1) 递归结束,ans++
        • dfs(2) 递归结束,ans++
      • 调用 dfs(3),进入 dfs(3)
        • 对 i = 0 到 1 进行递归调用:
          • 调用 dfs(0)返回
          • 调用 dfs(1),进入 dfs(1)
            • 对 i = 0 进行递归调用:
              • 调用 dfs(0)返回
            • dfs(1) 递归结束,ans++
          • 调用 dfs(2),进入 dfs(2)
            • 对 i = 0 到 1 进行递归调用:
              • 调用 dfs(0)返回
              • 调用 dfs(1),进入 dfs(1)
                • 对 i = 0 进行递归调用:
                  • 调用 dfs(0)返回
                • dfs(1) 递归结束,ans++
            • dfs(2) 递归结束,ans++
        • dfs(3) 递归结束,ans++
  3. 递归结束

    • dfs(6) 递归结束,ans++

总结每次递归调用的计数器变化

以下是详细的计数器变化情况:

  • dfs(6):
    • 递归 dfs(0):不增加 ans
    • 递归 dfs(1):1 次递归,ans 增加 1。
    • 递归 dfs(2):2 次递归,ans 增加 2。
    • 递归 dfs(3):3 次递归,ans 增加 3。

最终,dfs(6) 本身也会使 ans 增加 1。因此,总共计数器 ans 增加 6 次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值