2013-05-12 68 views
-1

我想在一個做多一個任務,如果條件,這裏是我的代碼:方案在一個做一個以上的工作,如果條件

(define (dont-tolerate-fools hist0 hist1 hist2 count) 
    (cond ((> 10 count) 'c) 
    ((< 10 count) (soft-tit-for-tat hist0 hist1 hist2)) 
    ((> 10 count) (dont-tolerate-fools hist0 hist1 hist2 (+ 1 count))))) 

它沒有工作,因爲我看到了一個的條件是真的,它返回並破壞。我試圖讓它在前10次返回'c後,它應該根據其他事情行事。

可能有不同的方法來做到這一點,但我很有趣,我怎麼能通過只檢查一個條件來做2個工作?

在此先感謝。

+0

「計數」會比10大,後來它不會叫不-容忍,傻瓜再次 – user2870 2013-05-12 19:11:28

回答

2

如果你想爲前10次做些事情,那麼最簡單的方法就是有一些「本地」變量來計算你被調用的次數,比如:

(define func 
    (let ((count 0)) 
    (lambda() 
     (cond 
     ((< count 10) 
     (set! count (+ count 1)) 
     'a) 
     (else 'b))))) 


(for/list ((i (in-range 15))) 
    (func)) 
=> '(a a a a a a a a a a b b b b b) 

您還可以看到在這個例子,你可以在條件後有多種形式和值:

(cond 
    ((< count 10) 
    (set! count (+ count 1)) ; action 1 
    'a)      ; action 2 

OTOH,如果簡單地認爲是一個循環,那麼你就錯過一個停止條件和一個電話:

(define (func (n 0)) 
    (cond 
    ((> n 15) 
    'stop) 
    ((< n 10) 
    (display 'c) 
    (func (+ n 1))) 
    (else 
     (display 'x) 
     (func (+ n 1))))) 

(func) 
=> ccccccccccxxxxxx'stop 
+0

這不是我關心的打印正確的結果的唯一的事。我想知道是否可以在一個if子句中調用2個函數。 - 或者等於這個 – user2870 2013-05-13 07:15:01

+1

對於* cond *我們已經證明可以。對於* if *你也可以,但是你需要用* begin *形式對它們進行分組。 – uselpa 2013-05-13 08:27:18

+0

是「開始」是我想要的。謝謝 – user2870 2013-05-13 14:19:01

1

cond的語法是:

(cond (<predicate> <body> ...) 
     ...) 

其中<body> ...意味着任何數量的表達式的。所以,你可以簡單地重寫代碼:

(define (dont-tolerate-fools hist0 hist1 hist2 count) 
    (cond ((> 10 count) 
     (dont-tolerate-fools hist0 hist1 hist2 (+ 1 count)) 
     'c) 
     ((< 10 count) (soft-tit-for-tat hist0 hist1 hist2)))) 
相關問題