求和的式子为:
设计一个程序,要求输入N的值(N>=0).当N为特定值时,输出i从0到正无穷的累加项.
题目出处:数据结构与算法分析 1.6(d)
我先从我的解决思路说起,明白原理的朋友可以直接跳到最下面看代码.
解决思路:可以先从N=0,N=1,N=2时入手,找一定规律₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉
当N=0时,是一个首项为1,公比为四分之一的等比数列,求和答案可以直接出:
当N=1时,构建两个数列,每个数列都构造成:一个数列乘以4,然后错位相减,
即3S=4a₁+4a₂-a₁+4a₃-a₂+…+4an-an-₁-an. 4a₁是常数,不是重点,an值是趋向于0的,所以也不用管.现在问题转化成如何求解中间的一大堆数的和.因为求和的式子分母是
,所以每个项和前面一个项的分母只差了4倍,又因为刚好乘了4倍,分母相同,只需做分子运算即可.把第一项也算进去的话,求和式子可以化为
当N=1时,代入上面的式子,答案为
![]()
,当N=2时,答案为
![]()
相信各位也已经发现规律了,N=a时,答案跟前a-1个答案有关.将
二项式展开,类似这种的
,每次的答案都可以分解成已求得的答案.
#include <iostream>
#include <vector>
using namespace std;
double sum(int num) {
if (num == 0) return (double)4 / 3;
vector<int>a;
a.push_back(1);
for (int i = 1; i <= num/2; i++)
a.push_back(a[i - 1] * (num + 1 - i) / i); //求得二项式展开前n/2项的系数
for (int i = (num/2)+1; i<=num; i++)
a.push_back(a[num - i]); //求得二项式后n/2项的系数
double sum_N = 0;
int i = -1;
while (++i <= num-1) {
sum_N += a[i] * sum(i); //递归,值累加系数乘以递归返回的值
}
return sum_N / 3;
}
int main() {
int n;
while (1) {
cin >> n;
double result = sum(n);
cout << result << endl;
}
return 0;
}
N值较小的时候我将答案与正确答案比对过,无误(N值大的时候程序运行时间较大,我没有判断)
在这个数学网站对照答案的:https://www.wolframalpha.com/