(数据结构与算法分析)求和

        求和的式子为:\sum_{i=0}^{\infty }(\frac{i^N}{4^i})

        设计一个程序,要求输入N的值(N>=0).当N为特定值时,输出i从0到正无穷的累加项.

题目出处:数据结构与算法分析 1.6(d)

        我先从我的解决思路说起,明白原理的朋友可以直接跳到最下面看代码.

        解决思路:可以先从N=0,N=1,N=2时入手,找一定规律₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉

        当N=0时,是一个首项为1,公比为四分之一的等比数列,求和答案可以直接出:\frac{4}{3}

        当N=1时,构建两个数列,每个数列都构造成:一个数列乘以4,然后错位相减, 

即3S=4a₁+4a₂-a₁+4a₃-a₂+…+4an-an-₁-an.    4a₁是常数,不是重点,an值是趋向于0的,所以也不用管.现在问题转化成如何求解中间的一大堆数的和.因为求和的式子分母是4^i,所以每个项和前面一个项的分母只差了4倍,又因为刚好乘了4倍,分母相同,只需做分子运算即可.把第一项也算进去的话,求和式子可以化为\frac{\sum_{i=0}^{\infty }\frac{(i+1)^N-i^N}{4^i}}{3}

        当N=1时,代入上面的式子,答案为\frac{4}{9}               \frac{1}{3}*(1*\frac{4}{3})

        ,当N=2时,答案为\frac{20}{27}                                     \frac{1}{3}*\left ( 2*\frac{4}{9}+1*\frac{4}{3} \right )

相信各位也已经发现规律了,N=a时,答案跟前a-1个答案有关.(i+1)^n二项式展开,类似这种的\sum_{i=0}^{\infty }\frac{i^2+i+i^N}{4^i}=\sum_{i=0}^{\infty }\frac{i^2}{4^i}+\sum_{i=0}^{\infty }\frac{i}{4^i}+\sum_{i=0}^{\infty }\frac{i^N}{4^i},每次的答案都可以分解成已求得的答案.

#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/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值