재귀 코드가 있으며 조건이 채워지면 종료해야합니다. 조건을 표시 할 때 목록을 표시 할 수 있지만 목록에 반환하지 못하게 처리 할 필요가없는 스택에 다른 호출이 있습니다.프로그램을 일찍 종료하고 목록을 반환하십시오.
0
A
답변
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)
구현이있는 경우 하나 (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
설명이 명확하지 않습니다. 몇 가지 코드를 게시하고 문제를 설명하십시오. – molbdnilo