讓f將一個值轉換爲另一個值,然後我正在寫一個重複n次轉換的函數。編寫函數的兩種方法,效率如何不同?
我已經提出了兩種不同的方式:
- 一個是 字面上應用函數N 次明顯的方式,所以重複(F,4)指X→ F( F(F(F(X))))
- 另一種方法是從 快速方法啓發用於供電,這意味着 將問題分爲2個 問題是一半大每當n是偶數時,。所以重複(F,4) 裝置X→G(G(X))其中G(X)= F(F(X))
起初我以爲第二方法不會提高效率。在一天結束時,我們仍然需要應用n次,不是嗎?在上面的例子中,g仍然會被翻譯成從沒有任何進一步的簡化,對吧?
但是,當我試用這些方法時,後一種方法明顯更快。
;; computes the composite of two functions
(define (compose f g)
(lambda (x) (f (g x))))
;; identify function
(define (id x) x)
;; repeats the application of a function, naive way
(define (repeat1 f n)
(define (iter k acc)
(if (= k 0)
acc
(iter (- k 1) (compose f acc))))
(iter n id))
;; repeats the application of a function, divide n conquer way
(define (repeat2 f n)
(define (iter f k acc)
(cond ((= k 0) acc)
((even? k) (iter (compose f f) (/ k 2) acc))
(else (iter f (- k 1) (compose f acc)))))
(iter f n id))
;; increment function used for testing
(define (inc x) (+ x 1))
事實上,((repeat2 INC 1000000)0)比((repeat1 INC 1000000)0)快得多。我的問題是第二種方法比第一種方法更有效嗎?是否重新使用相同的函數對象可以保留存儲空間並減少創建新對象所花費的時間?
所有後,應用程序必須被重複n次,或說是另一種方式,X→((X + 1)+1)不能被自動降低到X→(X + 2),對?
我在DrScheme 4.2.1上運行。
非常感謝。
這可能有助於http://en.wikipedia.org/wiki/Exponentiation_by_squaring – 2009-10-04 17:38:11
這裏的維基百科鏈接並不太相關 - 這是一種減少算術運算的方法。相似之處在於'repeat2'的創建工作少,而不是更少的工作。 – 2009-10-04 18:52:02