2013-05-12 3 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 раз, после чего он должен вести себя по другому.

Могут быть разные способы сделать это, но мне интересно, как я могу выполнить 2 задания, проверяя только одно условие?

Заранее спасибо.

+0

«счетчик» будет больше, чем 10, позже это обыкновение называть DonT-терпеть-дурак снова – user2870

ответ

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 

Ото, если это был просто должен быть цикл, то вы пропали без вести состояние останова и один звонок:

(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

Это не единственным, что я забочусь печатью правильного результата. Интересно, можно ли вызвать 2 функции только в одном условии if. -или что-то равное этому – user2870

+1

Для * cond * мы показали, что вы можете. Для * if * вы также можете, но вам нужно сгруппировать их с помощью формы * begin *. – uselpa

+0

Да «начало» - это то, что я хочу. Спасибо – user2870

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)))) 
Смежные вопросы