2016-09-22 57 views
0

我與COND語句很困惑 -電導率報表/球拍

我不知道我怎麼會寫沿僅使用一個COND的這一路線的東西:

(define (name x) 
    (cond [(statement 1 is true) 
      [(if statement 1 and statement 2 are both true) *print*] 
      [(if statement 1 is true and statement 2 is not) *print*]]) 

    [else (statement 1 is false) 
      [(if statement 1 is false and statement 2 is true) *print*] 
      [(if statement 1 and statement 2 are both false) *print*]]) 

(僞條件)

謝謝

+0

簡單的布爾代數...'和','或','不是'。然後寫一個真值表。你只有2個輸入,所以你只能有4個可能的結果。編輯:一個真值表可能會導致4個'cond'子句(包括'else'),但仍然會比嵌套的'if'更清晰。 – leppie

+0

或者,您不必檢查嵌套的if語句中的「語句1」,因爲它們已經被評估。 – leppie

+0

這是我對@leppie感到困惑的語法本身 –

回答

0

只需隨訪,以我的第二個建議(未回答):

(define (name x) 
    (if 'statement 1 is true' 
     (if 'statement 2 is true' 
      *print1* 
      *print2*) 
     (if 'statement 2 is true' 
      *print3* 
      *print4*))) 

這涵蓋了布爾情況。

1

由於您提到statement-1statement-2我認爲您的代碼可以進行大量優化,因爲嵌套if已經確定了statement-1的狀態。這裏是我如何看待它:

(if statement-1 
    (if statement-2 ; statement-1 consequent 
     consequent-1-2-true 
     alternative-1-true-2-false) 
    (if statement-2 ; statement-1-alternative 
     consequent-1-false-2-true 
     alternative-1-2-false)) 

statement-2只會因爲statement-1評估一次要麼是虛假的或真實的。

A cond更有用,當你有一個簡單的if-elseif,其中只有替代方案嵌套ifs。

(cond (predicate-1 consequent-1) 
     (predicate-2 consequent-2) 
     ... 
     (predicate-n consequent-2) 
     (else alternative)) 

現在你可以使用一個let來計算先進的陳述和使用and檢查不止一個爲真:

(let ((result-1 statement-1) (result-2 statement-2)) 
    (cond ((and result-1 result-2) consequent-1-2-true) 
     (result-1 consequent-1-true-2-false) 
     (result-2 consequent-1-false-2-true) 
     (else alternative-1-2-false))) 

當然這let是沒有必要的,如果聲明變量他們自己並因此被緩存。請注意,第一個之後的測試不需要檢查一個是否爲真,而第二個不是這樣,因爲我們知道這兩個都不是真的,那麼之前的結果就會被解僱並且cond已經完成。所有的派生人員都可以假設所有先前的謂詞都是錯誤的。

在編寫代碼時,最好考慮一下代碼更易於閱讀和理解的原因。在這種情況下,我不會使用cond,因爲問題的性質甚至嵌套在後果和替代方案上。