練習1 23 練習1 30

2021-06-20 03:30:48 字數 2944 閱讀 3183

1.練習1.23

改後的**如下:

(define (find-divisor-better n a)

(cond ((> (square a) n) n)

((divides?-better n a) a)

(else (find-divisor-better n (next-2 a)))))

(define (next-2 n)

(if (= 2 n)

(+ 1 n)

(+ 2 n)))

(define (find-min-prime-since-better n start-time number)

(cond ((= number 0) (display-info start-time (real-time-clock)))

((prime? n) (begin

(format #t "~s~%" n)

(find-min-prime-since-better (+ n (next-plus n)) start-time (- number 1))))

(else (find-min-prime-since-better (+ n (next-plus n)) start-time number)))

#f)

(define (next-plus n)

(if (even? n)

12))

電腦跑這些**的時候,沒有固定的執行時間,一直在變。不過結果是改後的基本是沒改前的0.5,也可能0.6左右。

2.練習1.24

**就不貼出來了,只是將上一題中的判斷是否為素數的方法改為費馬方法。

在檢測接近1000000的素數和接近1000的素數時,接近1000000的素數在時間上應該為(log1000000)=6應該大於接近1000的3的素數檢查,比值為2:1,實驗中計算從1000和1000000開始的1000個素數,1000開始的時間為695,而從1000000開始的時間為1470,比值接近於1:2, 與假設基本相同。

但是在帖子,那我猜,可能是64位和32位的不同了。

3.練習1.25

先求次方的結果會導致乙個很大的數求餘數,這樣的時間消耗會很大。

4.練習1.26

不使用square的結果是每次減半的expmod操作沒有了簡版的效果,所以時間複雜度會變回o(n) 。

5.練習1.27

(define (try-it a n)

(= (expmod a n n) a))

(define (carmichael-test n number)

(cond ((= number 0) true)

((try-it number n) (carmichael-test n (- number 1)))

(else false)))

(define (car-prime? n)

(carmichael-text n (- n 1)))

6.練習1.28

(define (new-expmod base exp m)

(define tmpbase 100)

(cond ((= exp 0) 1)

((even? exp) (begin

(set! tmpbase (new-expmod base (/ exp 2) m))

(if (and (not (= tmpbase (- m 1)))

(not (= tmpbase 1))

(= (remainder (square tmpbase)

m) 1))

0(remainder (square tmpbase)

m))))

(else (remainder (* base (new-expmod base (- exp 1) m))

m))))

(define (new-try-it n a)

(new-expmod a (- n 1) n))

(define (new-fermat-test n start)

(cond ((= start 1) true)

((= (new-try-it n start) 0) false)

(else (new-fermat-test n (- start 1)))))

(define (really-prime? n)

(new-fermat-test n (if (even? n)

(/ n 2)

(/ (- n 1) 2))))

沒有進行優化,但本身也有可能會有更好的方法吧。。。

7.練習1.29

(define (xps f a b n)

(define h

(/ (- b a) n))

(define (f1 k)

(f (+ a (* k h))))

(define (f2 k)

(if (or (= k 0) (= k n))

(f1 k)

(if (even? k)

(* 2 (f1 k))

(* 4 (f1 k)))))

(define (add-h x)

(+ x 1))

(* (/ h 3)

(sum f2 0 add-h n)))

8.練習1.30

(define (sum term a next b)

(define (iter a result)

(if (> a b)

result

(iter (next a) (+ (term a) result))))

(iter a 0))

SICP練習 17 練習1 23

練習1.23 首先我們按照題目要求來寫出相應的next函式,然後再修改find divisor函式。define next x if x 2 3 n 2 define find divisor ntest divisor cond square test divisor n n divides?te...

SICP練習 17 練習1 23

練習1.23 首先我們按照題目要求來寫出相應的next函式,然後再修改find divisor函式。define next x if x 2 3 n 2 define find divisor ntest divisor cond square test divisor n n divides?te...

DOM基礎1 30 程式設計練習

1 30 程式設計練習 小夥伴們,今天我們學習了刪除物件屬性的方法,那麼接下來用刪除物件屬性的方法把預設 中p標籤的樣式全部去掉。乙個人的快樂,不是因為他擁有的多,而是因為他計較的少。靜坐常思己過,閒談莫論人非,能受苦乃為志士,肯吃虧不是痴人,敬君子方顯有德,怕小人不算無能,退一步天高地闊,讓三分心...