递归会占用大量的空间,在数据过大时,程序很可能无法正常运行
例如此程序,使用递归,我的垃圾电脑10000都算不到,直接报错了
void coutl1(int x) {
if (x) {
coutl1(x - 1);
cout << x;
}
return ;
}
int main() {
int n;
cin >> n;
coutl1(n);
return 0;
}
而使用一个普通的循环的话就可以到10000甚至更多了
void coutl2(int x) {
for (int i = 1; i <= x; i++)
{
cout << i;
}
return;
}
int main() {
int n;
cin >> n;
coutl2(n);
return 0;
}
计算多项式
多项式形如 f(x)=a0+a1x+…+an-1x^n-1+anx^n
一般写法
int main() {
int a[5] = { 1,2,3,4,5 }, x;
double sum = 0;
cin >> x;
for (int i = 0; i < 5; i++)
{
sum += a[i] * pow(x, i);
}
cout << sum << endl;
return 0;
}
而聪明的读者已经想到了(紫皮书后遗症hhh),秦九昭算法
将原式变形如 f(x)=a0+x(a1+x(…(an-1+x(an))))
则可以写成
int main() {
int a[5] = { 1,2,3,4,5 }, x;
double sum = a[4];
cin >> x;
for (int i = 5-2; i >= 0; i--)
{
sum = sum * x + a[i];
}
cout << sum << endl;
return 0;
}
可以通过time.h的clock()来看时间差别,这里还有区别于之前的另一种方式
也许把cin放外面可以简单的避开输入时间的影响
#include<time.h>
clock_t start, stop;
int main() {
start = clock();
//调用
stop = clock();
cout<<((double)(stop-start))/CLK_TCK;
return 0;
}
clock_t是clock tick,即“时钟打点”,CLK_TCK为每秒钟机器打点数
运行时间非常短哦,基本为零,可以重复调用多遍
同时使用了下之前用过的,但他们结果有细微差别
cout << (double)clock() / CLOCKS_PER_SEC << endl;
计算多项式
用不同方式算f(1.1)
clock_t start1, stop1,start2,stop2;
void function1()
{
double sum = 1, x = 1.1;
for (int i = 1; i <= 100; i++)
{
sum += pow(x, i) / i;
}
//cout << sum << endl;
return;
}
void function2()
{
double sum = 1 / 100, x = 1.1;
for (int i = 99; i > 0; i--)
{
sum = sum * x + 1 / i;
}
//cout << sum << endl;
return;
}
int main()
{
start1 = clock();
for (int i = 0; i < 1e6; i++)
function1();
stop1 = clock();
start2 = clock();
for (int i = 0; i < 1e6; i++)
function2();
stop2 = clock();
cout << ((double)(stop1 - start1)) / CLK_TCK << '\n'
<< ((double)(stop2 - start2)) / CLK_TCK << endl;
return 0;
}
运行结果
时间差别还是挺明显的