2017-03-12 22 views
0

私は再帰的なコードを持っており、条件が満たされたときに終了する必要があります。私は条件をリストに表示することができますが、次にスタックに別の呼び出しがあり、それを処理する必要はないので、リストを返すことはできません。プログラムを早期に終了してリストを返す

+0

説明はあまり明確ではありません。いくつかのコードを記入し、あなたが解決している問題を記述してください。 – molbdnilo

答えて

1

Sylwesterのソリューションのバリエーション:この方法で継続を使用

(define (example n) 
    (call-with-current-continuation 
    (lambda (return) 
    (let loop ([n 0]) 
     (if (= n 5) ; done 
      (return 'the-result) 
      (loop (+ n 1))))))) 

(example 10) 

は、あなたの実装が持っている場合は、1つは(call/ecとエスケープ継続の代わりに、完全な継続を使用することができますエスケープ継続)。

+0

ありがとう!それはまさに私が必要なものです! –

+0

キャンセルを継続するのを待つことなく、ここで 'call/cc'を使用する理由はわかりません。ただ「結果」がその仕事をしただけです。 – Sylwester

1

アキュムレータを使用することをお勧めします。中止は再帰的ではありません。

(define (copy-unless-contains-5 lst) 
    (define (helper lst acc) 
    (cond 
     ((null? lst) (reverse acc)) 
     ((equal? (car lst) 5) #f) 
     (else (helper (cdr lst) (cons (car lst) acc))))) 
    (helper lst '())) 

あなたが継続して再帰的にされており、それはそれを行うための最適な方法であれば、call-with-current-continuationはあなたの継続を待って中止する方法を提供して返すために何を選択することができます。

(define (copy-unless-contains-5 lst) 
    (call-with-current-continuation 
    (lambda (abort) 
    (define (helper lst) 
     (cond 
     ((null? lst) '()) 
     ((equal? (car lst) 5) (abort #f)) 
     (else (cons (car lst) (helper (cdr lst)))))) 
    (helper lst)))) 

言うまでもなく、この最後のバージョンはあまりにも複雑です。どちらも、同じように機能:

(copy-unless-contains-5 '(1 2 3 4)) ; ==> (1 2 3 4) 
(copy-unless-contains-5 '(1 2 5 3 4)) ; ==> #f 
関連する問題