1

目標は、すべての内側の括弧を削除することです。

(flatten'(a(bc)d))は'(abcd)になります

これはRacketの私のコードです

; 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])))

不平を言っている

procedure application: expected procedure, given: c; arguments were: ()

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)が空のリストをキャッチしなかったのですか?2つの再帰呼び出しがあります。空のリストをキャッチした場合は、リストである次の再帰に進みます{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)

ロス・ラーソンが示唆したように、appendはプログラムを機能させます。しかし、学習のために、誰かが時間に余裕がある場合、私のテストの結果は、合格した基本ケース(2番目と空のリスト)のみを示しています

を呼び出すラッパー関数を書くことを考えました(cons (flatten slist) empty)

4

2 に答える 2

5

問題は次の式です。

((フラット(車のスリスト))...)

つまり、(フラット化...)返されたものをすべて適用します。ただし、これはリストを返すため、アプリケーションは失敗します。

に変更します

(フラット(車のスリスト))

于 2012-02-13T15:39:56.853 に答える
1

短所は構造を再作成します(あなたが観察したように)。代わりにappendを調べてください。

http://docs.racket-lang.org/reference/pairs.html

(他の回答で再帰値の適用が修正されたように見えるため、他の問題には対処しません)

于 2012-02-13T23:36:36.017 に答える