计算机程序的构造和解释 练习题1.22

题目给出的过程如下

(define (timed-prime-test n)
	(newline )
	(display n )
	(start-prime-test n (runtime)))
(define (start-prime-test n start-time)
	(if (prime? n)
		(report-prime(- (runtime) start-time))))
(define(report-prime elapsed-time)
	(display "***")
	(display elapsed-time))

我们需要构造一个完整的search-for-primes过程

#lang racket

(define (square x) (* x x))
(define (runtime) ( current-inexact-milliseconds )) 
(define(smallest-divisor n)
	(find-divisor n 2))
(define(find-divisor n test-divisor)
	(cond((>(square test-divisor) n ) n)
		((divides? test-divisor n) test-divisor)
		(else(find-divisor n (+ test-divisor 1)))))

(define(divides? a b)
	(=(remainder b a) 0))
(define (prime? n)
	(= n (smallest-divisor n)))

(define (timed-prime-test n) 
	(start-prime-test n (runtime)))
(define (start-prime-test n start-time)
	(if (prime? n)
		(begin (report-prime n (- (runtime) start-time)) #t) #f))
(define(report-prime n elapsed-time)
  	(newline)
        (display n)
	(display " usetime ")
	(display elapsed-time))
	
(define (search-for-primes n count)
  (cond((= count 0) n )
  ((timed-prime-test n) (search-for-primes (+ n 1) (- count 1)))
    (else (search-for-primes (+ n 1) count))))

(search-for-primes 1000 3)
(search-for-primes 10000 3)
(search-for-primes 100000 3)
(search-for-primes 1000000 3)
(search-for-primes 10000000 3)

现在的机器运行效率都太高了,运行结果不是很明显。
以下为运行结果:

1009 usetime 0.0
1013 usetime 0.0
1019 usetime 0.01020

10007 usetime 0.0
10009 usetime 0.0
10037 usetime 0.010038

100003 usetime 0.0
100019 usetime 0.0
100043 usetime 0.0100044

1000003 usetime 0.0
1000033 usetime 0.0
1000037 usetime 0.01000038

10000019 usetime 0.0
10000079 usetime 0.0
10000103 usetime 0.010000104

按照这个结果不是很好能体现结果之间的时间差为√10,也不是很好能说明运行的时间正比于计算所需的步数。所以我加大了计算的次数,用以下数做实验

(search-for-primes 1000000000 3)
(search-for-primes 10000000000 3)
(search-for-primes 100000000000 3)
(search-for-primes 1000000000000 3)
(search-for-primes 10000000000000 3)

结果

1000000007 usetime 1.99853515625
1000000009 usetime 2.99755859375
1000000021 usetime 1.9982910156251000000022

10000000019 usetime 8.99462890625
10000000033 usetime 6.995361328125
10000000061 usetime 5.99584960937510000000062

100000000003 usetime 25.984130859375
100000000019 usetime 74.956787109375
100000000057 usetime 27.984130859375100000000058

1000000000039 usetime 88.948974609375
1000000000061 usetime 88.94873046875
1000000000063 usetime 70.95996093751000000000064

10000000000037 usetime 254.852783203125
10000000000051 usetime 248.857177734375
10000000000099 usetime 242.87036132812510000000000100

这样的计算结果基本符合每增加10倍的n值,计算时长也会增加√10≈3.16倍。
关于运行时间正比于计算所需步数的说法也进行了验证,几乎每次都会出现后面的数反而比前面数计算时间要短的情况,还不知道具体的原因,
但是就目前的情况来看,我得到的结果不符合这种说法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值