2011-05-03 28 views
1

當我有兩個條件,爲每個條件的動作,而這兩種情況的行動,如果有一個爲真,什麼是最好的方式來構建一個if語句的兩個條件,每個動作都有一個動作?

有時候,我這樣做

if (cond1 or cond2) 
    if (cond1) 
     do act 1 
    if (cond2) 
     do act 2 
    do always 

有時候,我這樣做

if (cond1) 
    do act 1 
    do always 
if (cond2) 
    do act 2 
    do always 

但我真的想這樣做

if (cond1) 
    do act 1 
or if (cond2) 
    do act 2 
then 
    do always 

最後一種方法是否以任何語言存在,或者是否存在處理這種情況的首選方法?

謝謝。

回答

5

我建議如下:

if (cond1) 
    do act 1 
if (cond2) 
    do act 2 
if (cond1 or cond2) 
    do always 
1

如果你真的需要這一點,這是笨拙的共同 事情提取到其他功能,你可以使用宏這樣 (未經測試,Common Lisp的):

(defmacro cond-any (clauses) 
    (let ((any-clause (gensym "any"))) 
    `(let ((,any-clause nil)) 
     (cond ,@(mapcar (lambda (clause) 
         (if (eq (first clause) :any-after) 
          (setf any-clause (rest clause)) 
          (append clause any-clause))) 
         clauses))))) 

這給了你這樣做的能力:

(cond-any (:any-after do-always) 
      (cond1 do-1) 
      (cond2 do-2)) 

關鍵字:any-after則意味着「如果任何後續條件 爲真,則在其後部分後追加」。

+0

擰規矩,我有LISP – hugomg 2011-05-04 01:32:02

0
return unless (cond1 or cond2) 
if (cond1) 
    do_act 1 
if (cond2) 
    do_act 2 
do_always 
0

多個If語句導致更多的時間消耗,因爲每個單獨評估。爲了避免這種情況,如果使用階梯來減少時間,則使用它。我的建議: -

if(cond1 AND cond2) 
     do act 1 
     do act 2 
     do always 
else if (cond1 OR cond2) 
     if(cond1) 
      do act 1 
     else 
      do act 2 
     do always 

在所有的解決方案,比較次數是最少的2但是,在這種特定的解決方案,最低爲1。所以理想情況下,這應該是最合適的。

+0

我不喜歡這個。邏輯不是很順暢,很多代碼都是重複的,並且通常較大的代碼大小會比您保存的一個比較多得多... – hugomg 2011-05-04 01:29:30

+0

Yup thats true :( – NirmalGeo 2011-05-04 01:33:10

1

首選儘可能不涉及重複代碼的內容。

這種替代可能是最靈活的,以最小的重複:

var := false 

if (cond1) 
    do act 1 
    var := true 

if (cond2) 
    do act 2 
    var := true 

if (var) 
    do always 

您可能會發現,有一些你想VAR集多次,或隨着時間的推移和「如果」的數量你想「永遠做」增長。這樣避免了「複雜」和/或陳述。

相關問題