1. 程式人生 > >痛心!一題可見餘之弱雞

痛心!一題可見餘之弱雞

1.計算下列級數的和

S(x)=1+x+\frac{x^{2}}{2!}+\frac{x^{3}}{3!}+\frac{x^{4}}{4!}+......+\frac{x^{n}}{n!}

直到\frac{x^{n}}{n!}<10^{-6}

這道題是老生長談了,首先我的第一反應就是找規律,找分子分母的跟據該項的順序變化規律,然後演算法就是在迭代的過程中分別變化分子分母然後相除,把分子分母的計算給分開了。

#include<stdio.h>
double S(int x)
{
	int n = 1;
	double s = 1;	//結果

	double a = x;	//每一項的分子
	double b = 1;	//每一項的分母
	for (int i = 1; i <= n; i++)
	{
		double k = a / b;	//每一項
		s += k;

		if (k - 1e-6 < 0)
			break;

		a *= x;
		b *= i;
		n++;
	}
	return s;
}

 其實這個可以找到其中的數學關係,根據遞迴呼叫,可以很明瞭地解決問題。

設級數第n項為Tn=\frac{x^{n}}{n!} ,則第n+1項為Tn+1=\frac{x^{n+1}}{(n+1)!}=\frac{x^{n}}{n!}\cdot \frac{x}{n+1},得到遞推式為Tn+1=\frac{x}{n+1}\cdot TnT0=1

#include<stdio.h>
double S(int x)
{
	double s = 1.0;		//結果
	double t = 1.0;		//每一項
	int n = 1;	//從0開始該項的項數
	do {
		t = t * x / n;
		s += t;
		n++;
	} while (t > 1e-6);

	return s;
}

此法相當於將每一項作為一個整體而不去關注每一項內部的關係,而關注的是前後兩項的規律,哪一個更好,一目瞭然。

反省了一下,歸根結底就是對遞迴演算法的不敏感,當然這來源於數學嗅覺差,數學不好(一想到這就傷心)。