목표는 모든 내부 괄호를 제거하는 것입니다.내부 괄호를 제거하고 빈 목록으로 실행하고 단점을 사용하여 제거하지 않음
(평평 '(A (BC) D))이된다'(ABCD)는
이 그것은
procedure application: expected procedure, given: c; arguments were:()
을 불평
; if slist is null, return empty
; otherwise, if it is a pair, recursively solve car and cdr and concat them
; if it is a symbol, return the symbol
(define flatten
(lambda (slist)
(cond
[ (null? slist) '()]
[ (pair? slist)
(cons ((flatten (car slist)) (flatten (cdr slist))))]
[ (symbol? slist) slist])))
라켓 내 코드입니다 즉, 빈 목록에 car
및 cdr
에 액세스하려고합니다.
I did the trace:
> (flatten '(a (b c) d))
pair?-car-cdr
a
((b c) d)
symbol?
a
pair?-car-cdr
(b c)
(d)
pair?-car-cdr
b
(c)
symbol?
b
pair?-car-cdr
c
()
symbol?
c
(stops here)
추적 코드는 간단합니다. 이해가 안 무엇
(define flatten
(lambda (slist)
(cond
[ (null? slist) '()]
[ (pair? slist)
(display 'pair?-car-cdr)
(newline)
(display (car slist))
(newline)
(display (cdr slist))
(newline)
(cons ((flatten (car slist)) (flatten (cdr slist))))]
[ (symbol? slist)
(display 'symbol?)
(newline)
(display slist)
(newline)
slist])))
는 빈리스트를 잡을하지 않았다 첫 번째 조건 (null? slist)
와서 어떻게? 두 번의 재귀 호출이 있습니다. 빈 목록을 찾은 경우 목록 인 다음 재귀로 이동합니다 {d}
.
내 재귀 논리의 문제점은 무엇입니까?
업데이트 버전
로스 라슨이 제안한 것처럼(define flatten
(lambda (slist)
(cond
[ (null? slist) '()]
[ (pair? slist)
(cons (flatten (car slist)) (flatten (cdr slist)))]
[ (symbol? slist) slist])))
(display (equal? (flatten '(a (b a) b a c (a b) c (e f (b a)))) '(a b a b a c a b c e f b a)))
(newline)
(display (equal? (flatten '(a b c)) '(a b c)))
(newline)
(display (equal? (flatten '(a (b c))) '(a b c)))
(newline)
(display (equal? (flatten '((a)(b)(c) d)) '(a b c d)))
(newline)
(display (equal? (flatten '(a (b) ((c)) (((d))) ((((e (f g))))))) '(a b c d e f g)))
(newline)
(display (equal? (flatten '()) '()))
(newline)
(display (equal? (flatten '(a b()())) '(a b)))
(newline)
, 프로그램이 작동하는지 확인합니다 추가합니다. 하나는 여분의 시간이하지만 학습을 위해, 내 테스트의 결과는 내가 (cons (flatten slist) empty)
에만 전달되는 기본 케이스 (2 및 빈리스트)를 보여
이((평평 (자동차 SLIST)) ...)
이 의미, 무엇이든 (평평하게 ...) 수익률을 적용
그냥 더블 확인
http://docs.racket-lang.org/reference/pairs.html
(이것은 다른 답변을 재귀 값의 적용 문제를 해결 한 것 같다 나는 다른 문제를 해결하지 않음) : DrRacket 제대로 코드의 영역을 강조 않았다'((flatten (car slist)) (flatten (cdr slist)))'오류가 발생 했습니까? 그렇게해야하며, GUI가 올바른 일을하고 있는지 확인하고 싶습니다. – dyoo
@dyoo 네, 맞습니다. 감사. – CppLearner