群里面的一道题

已知:

#include <iostream>

using namespace std;
int cnt = 1;
void cal(int start)
{
    for (int i = start; i < 10; i++) {
        cnt ++;
        cal(i+1);
    }
}
int main() {
    cal(0);
    cout << cnt << endl;
    return 0;

}

求cnt

解:记cal(i)对cnt增加的次数为a(i)

容易得到:

a(9)=1;

a(i)=a(i+1)+...+a(9)+10-i;(1)

a(i+1)=a(i+2)+...+a(9)+9-i;(2)

(1)-(2)

a(i)-2a(i+1)=1;(3)

(3)两边同时*2^i,

2^i*a(i)-2^(i+1)*a(i+1)=1

......

3*2^8-2^9=2^8;

把上面的式子累加:

2^i*a(i)=2^i+....+2^(9-i)

a(i)=2^(10-i)-1;

令i=0,

cnt=1024;

好的!下面是一道新的 **C++ 递归算法目**,适合巩固对递归和分治思想的理解。 --- ## 🧩目:求解斐波那契数列的第 n 项(递归实现) ### 目描述: 斐波那契数列定义如下: - F(0) = 0 - F(1) = 1 - F(n) = F(n - 1) + F(n - 2), 当 n ≥ 2 请使用**递归算法**编写一个函数 `fibonacci(int n)` 来计算斐波那契数列的第 `n` 项。 ### 示例输入输出: | 输入 | 输出 | |------|------| | 0 | 0 | | 1 | 1 | | 5 | 5 | | 7 | 13 | --- ### ✅ 解思路: 这是一道经典的递归入门。虽然递归版本效率不高(存在大量重复计算),但非常适合理解递归的基本结构: - 基本情况(base case): - 如果 `n == 0`,返回 0; - 如果 `n == 1`,返回 1; - 递归情况(recursive case): - 返回 `fibonacci(n - 1) + fibonacci(n - 2)` --- ### 💻 C++ 实现代码如下: ```cpp #include <iostream> using namespace std; // 递归函数:计算斐波那契数列第 n 项 int fibonacci(int n) { // 基本情况 if (n == 0) return 0; if (n == 1) return 1; // 递归调用 return fibonacci(n - 1) + fibonacci(n - 2); } // 主函数测试样例 int main() { int n; cout << "请输入一个整数 n(n >= 0): "; cin >> n; if (n < 0) { cout << "输入无效,请输入非负整数!" << endl; } else { cout << "斐波那契数列第 " << n << " 项是:" << fibonacci(n) << endl; } return 0; } ``` --- ### 🔍代码解释: - 函数 `fibonacci` 使用了两个递归调用来完成任务; - 每次递归都在将问规模缩小; - 最终通过 base case 终止递归; - 在主函数中,程序读取用户输入并输出对应的结果。 --- ### ❗注意: 递归方式虽然直观,但时间复杂度为 **O(2^n)**,效率非常低。对于较大的 `n`(如 `n > 30`),运行速度会明显变慢。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值