MOOC 1.1 什么是数据结构
例1: printN
#include <cstdio> //void PrintN(int N) //{ // for(int i = 1; i <= N; ++ i) // { // printf("%d\n", i); // } // // return ; //} void PrintN(int N) { if(N) { PrintN(N - 1); printf("%d\n", N); } return ; } int main() { int n; scanf("%d", &n); PrintN(n); return 0; }
例二: 多项式
运行时间不到一个tick, 那怎么才能显示出一个tick所用的时间呢?(即如何测出不到1个tick的程序运行时间?)
让被测函数重复运行多次, 使得测出的总的时钟打点数间隔充分长, 最后计算出被测函数平均每次运行的时间即可
// f(x) = a0 + a1x + ... + an-1x^n-1 + anx^n #include <cstdio> #include <ctime> #include <cmath> #define MAXN 10 // 多项式最大项系数, 即多项式阶数+1 #define MAXK 1e7 // 被测函数最大重复调用次数 double f1(int n, double a[], double x); double f2(int n, double a[], double x); void time(double (*f2)(int n, double a[], double x)); double a[MAXN]; // 存储多项式的系数 void time(double (*f2)(int n, double a[], double x)) { clock_t start, stop; double duration; start = clock(); /* 重复调用函数以获得充分的时钟打点数 */ for(int i = 0; i < MAXK; ++ i) { f2(MAXN - 1, a, 1.1); } stop = clock(); // 计算函数单次运行的时间 duration = ((double)(stop - start)) / CLK_TCK / MAXK; printf("ticks = %f\n", (double)(stop - start)); printf("duration = %6.2e\n", duration); } double f1(int n, double a[], double x) { double p = a[0]; for(int i = 1; i <= n; ++ i) { p += (a[i] * pow(x, i)); } return p; } double f2(int n, double a[], double x) { double p = a[n]; for(int i = n; i > 0; -- i) { p = a[i - 1] + x * p; } return p; } int main() { for(int i = 0; i < MAXN; ++ i) { a[i] = (double)i; } time(f2); return 0; } /* ticks = 1813.000000 duration = 1.81e-007 ticks = 297.000000 duration = 2.97e-008 */