【数列】求序列之和——递归
请使用递归算法求下列序列的前n项之和。
1 + 1/2 - 1/3 + 1/4 -1/5 ......
输入:
n
输出:
1 + ∑ m = 2 n ( − 1 ) m m − 1 1 + \sum_{m=2}^{n} {(-1)^m m^{-1}} 1+∑m=2n(−1)mm−1
样例:
序号 | 测试输入 | 期待的输出 | 额外进程 |
---|---|---|---|
1 | 1↵ | 1↵ | 0 |
2 | 2↵ | 1.500000↵ | 0 |
3 | 3↵ | 1.166667↵ | 0 |
思路
首先假设我们有递归函数F(n)返回值为
1
+
∑
m
=
2
n
(
−
1
)
m
m
−
1
1 + \sum_{m=2}^{n} {(-1)^m m^{-1}}
1+∑m=2n(−1)mm−1
然后观察F(n)和F(n+1)的关系:
F
(
n
)
=
{
=
1
,
当
n
=
1
=
F
(
n
−
1
)
+
1
n
,
当
n
%
2
=
=
0
=
F
(
n
−
1
)
−
1
n
,
当
n
%
2
!
=
0
F(n)=\left\{\begin{matrix} =1,当 n=1\\ \\ =F(n-1)+\frac{1}{n},当n\%2==0\\ \\ =F(n-1)-\frac{1}{n},当n\%2!=0 \end{matrix}\right.
F(n)=⎩
⎨
⎧=1,当n=1=F(n−1)+n1,当n%2==0=F(n−1)−n1,当n%2!=0
代码
#include <stdio.h>
double Sum(double n)
{
if (n == 1)
return 1;
else if (n % 2 == 0)
return 1 / n + Sum(n - 1);
else if (n % 2 == 1)
return -1 / n + Sum(n - 1);
}
int main()
{
double n;
scanf("%lf", &n);
getchar();
double y = Sum(n);
if (y == (int)y)
printf("%d\n", (int)y);
else
printf("%f\n", y);
return 0;
}