将顺序查找函数的迭代程序(程序1-24)转换成等价的递归程序,测量其性能。
#include <stdio.h>
#include <time.h>
#define MAX_SIZE 10001
#define ITERATION 13
int seqsearch(int *,int,int);
int seqsearch2(int *,int,int);
int main(void){
int n_size[] = {10,20,50,80,100,200,400,800,1000,2000,5000,8000,10000};
long repeat[] = {50000000,20000000,10000000,10000000,10000000,
3000000,2000000,600000,400000,200000,180000,160000,140000};
int list[MAX_SIZE];
double dur_time1[ITERATION],dur_time2[ITERATION];
for(int i = 0;i < ITERATION;i++){
for(int j = 0;j < n_size[i];j++)
list[j] = j;
int searchnum = n_size[i];
int start,end;
start = time(NULL);
for(int k = 0;k < repeat[i];k++)
seqsearch(list,searchnum,n_size[i]);
end = time(NULL);
dur_time1[i] = difftime(end,start) / repeat[i];
start = time(NULL);
for(int k = 0;k < repeat[i];k++)
seqsearch2(list,searchnum,n_size[i]);
end = time(NULL);
dur_time2[i] = difftime(end,start) / repeat[i];
}
printf("Times of iteration versus recursion:\n");
printf("%-10s%-20s%-20s\n","n","iteration/s","recursion/s");
for(int i = 0;i < ITERATION;i++)
printf("%-10d%-20.8e%-20.8e\n",n_size[i],dur_time1[i],dur_time2[i]);
}
int seqsearch(int list[], int searchnum, int n){
int i;
list[n] = searchnum;
for(i=0;list[i] != searchnum;i++)
;
return ((i < n) ? i : -1);
}
int seqsearch2(int list[], int searchnum, int n){
if (n < 0)
return -1;
else{
if (list[n-1] == searchnum)
return n-1;
else
seqsearch2(list,searchnum,n-1);
}
}
运用管道输出到results.txt文档:
mytest.ext>results.txt
两种格式的输出结果如下:
Times of iteration versus recursion:
n iteration/s recursion/s
10 2.00000000e-008 0.60000000e-007
20 0.00000000e+000 1.00000000e-007
50 1.00000000e-007 0.30000000e-006
80 1.00000000e-007 0.40000000e-006
100 0.20000000e-006 0.40000000e-006
200 6.66666667e-007 6.66666667e-007
400 1.00000000e-006 1.50000000e-006
800 1.66666667e-006 3.33333333e-006
1000 2.50000000e-006 5.00000000e-006
2000 5.00000000e-006 1.00000000e-005
5000 1.11111111e-005 2.77777778e-005
8000 1.87500000e-005 4.37500000e-005
10000 1.42857143e-005 5.71428571e-005
Times of iteration versus recursion:
n iteration/s recursion/s
10 0.00000002 0.00000006
20 0.00000005 0.00000005
50 0.00000020 0.00000020
80 0.00000020 0.00000030
100 0.00000030 0.00000040
200 0.00000033 0.00000100
400 0.00000050 0.00000200
800 0.00000167 0.00000333
1000 0.00000250 0.00000500
2000 0.00000500 0.00001000
5000 0.00001111 0.00002778
8000 0.00001875 0.00004375
10000 0.00002143 0.00005000