为什么 for 循环在递增计数和递减计数时表现不同?
Why does for-loop behave differently when counting up vs counting down?
这是一道我最近重温的作业题。它要求我不使用cmath
并编写一个函数来评估cos pi/3
。密码是
#include <iostream>
using namespace std;
double power(double x, int b) {
if (b>1) return x*power(x,b-1);
else if (b==0) return 1;
else return x;
}
double cosine(double x, int k) {
double tmp=0;
for (int n=0; n<=k; n++) {
tmp += power(-1,n) / factorial(2*n) * power(x,2*n);
}
return tmp;
}
int main() {
double x=3.1415/3;
int k=100;
cout << cosine(x,k) << endl;
}
我用 for-loops 写了两个版本的 double factorial(int a)
。
一个加起来成功输出0.500027
:
double factorial(int a) {
double tmp=1;
for (int i=1; i<=a; i++) {
tmp*=i;
}
return tmp;
}
另一个倒数输出inf
(但成功求值4!=24):
double factorial(int a) {
double tmp=a;
for (int i=a; i>=1; i--) {
tmp*=i;
}
return tmp;
}
为什么倒计时循环无法给出收敛输出?
第二个factorial()
乘以a
两次。试试这个:
double factorial(int a) {
double tmp=1; // use 1 instead of a
for (int i=a; i>=1; i--) {
tmp*=i;
}
return tmp;
}
请注意,使用double tmp=a;
并将i
初始化为a-1
并不好,因为它会使factorial(0) = 0
,而factorial(0)
应该为1。
第一个实现也乘以 1 两次,但乘以 1 不影响结果。
这是一道我最近重温的作业题。它要求我不使用cmath
并编写一个函数来评估cos pi/3
。密码是
#include <iostream>
using namespace std;
double power(double x, int b) {
if (b>1) return x*power(x,b-1);
else if (b==0) return 1;
else return x;
}
double cosine(double x, int k) {
double tmp=0;
for (int n=0; n<=k; n++) {
tmp += power(-1,n) / factorial(2*n) * power(x,2*n);
}
return tmp;
}
int main() {
double x=3.1415/3;
int k=100;
cout << cosine(x,k) << endl;
}
我用 for-loops 写了两个版本的 double factorial(int a)
。
一个加起来成功输出0.500027
:
double factorial(int a) {
double tmp=1;
for (int i=1; i<=a; i++) {
tmp*=i;
}
return tmp;
}
另一个倒数输出inf
(但成功求值4!=24):
double factorial(int a) {
double tmp=a;
for (int i=a; i>=1; i--) {
tmp*=i;
}
return tmp;
}
为什么倒计时循环无法给出收敛输出?
第二个factorial()
乘以a
两次。试试这个:
double factorial(int a) {
double tmp=1; // use 1 instead of a
for (int i=a; i>=1; i--) {
tmp*=i;
}
return tmp;
}
请注意,使用double tmp=a;
并将i
初始化为a-1
并不好,因为它会使factorial(0) = 0
,而factorial(0)
应该为1。
第一个实现也乘以 1 两次,但乘以 1 不影响结果。