目录
题目描述
我们要求找出具有下列性质数的个数(包含输入的正整数 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
为例,分析整个递归过程。
-
初始调用:
- 调用
dfs(6)
,进入递归函数:n
不为 0,进入else
分支。
- 调用
-
处理
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++
。
- 对
- 调用
- 对
-
递归结束:
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 次。