2011-06-02 47 views
2

我正在解決htdp.org的問題。我想在計劃中知道這是一個更好的實踐來評估具有常見運算符(如'+'或'*')的長表達式。哪種編程習慣可以用來評估方案中的表達式

實施例:

> (* 1 10 10 2 4)     ; Version A 
> (* 1 (* 10 (* 10 (* 2 4))))  ; Version B 

我應該遵循A或B.此外,我請考慮像汽缸的表面積的代數表達式,上面的例子。

-Abhi

+0

這裏有更多的上下文嗎?如果這是一個關於評估更復雜的陳述的問題,那麼相互之間可能會有價值。 – Keen 2011-06-02 18:48:31

+0

在Scheme中,算術運算符並不完全是二元的,所以兩個表達式是等價的。由您決定哪種形式更好。 – 2011-06-03 02:56:29

回答

8

真正的問題應該是,做自己產生不同的結果?讓我們嘗試在我們REPL:

>> (* 1 10 10 2 4) 
800 
>> (* 1 (* 10 (* 10 (* 2 4)))) 
800 
>> 

由於他們基本上是相同的(使用你的例子),我會選擇與代碼中較低儀式/吵鬧聲不絕於耳。使用第一個。

+1

第一個更容易閱讀,許多Scheme評估者會對其進行等效處理。 – 2011-06-02 16:46:12

+0

感謝您的信息。欣賞它! – abhi09 2011-06-04 16:06:14

1

對此有點跟進。當你談論時機時,(* a b c ...)不一定等於(* (* a b) ...)

有些實現可以識別常見的操作,但儘量定時階乘的這兩個定義:

(define (f1 n) 
    (let loop ((up 2) 
      (down n) 
      (a 1)) 
    (cond ((> up down) a) 
      ((= up down) (* a up)) 
      (else 
      (loop (+ 1 up) (- 1 down) 
       (* a up down)))))) 

(define (f2 n) 
    (let loop ((up 2) 
      (down n) 
      (a 1)) 
    (cond ((> up down) a) 
      ((= up down) (* a up)) 
      (else 
      (loop (+ 1 up) (- 1 down) 
       (* a (* up down))))))) 

第二個過程是大大高於第一個給我。

+0

這就是一個很好的例子,謝謝'匿名'。在第二個過程中爲解決上一個陳述中的多個表達式創建一個額外的括號會導致更快的處理 - 聽起來不錯。一定會在Dr Racket上試用它。 – abhi09 2011-06-15 12:03:25