2011-10-29 6 views
1
例えば

、 入力された場合: (リスト(リスト1)(リスト2)(リスト3)) 出力は次のようになります (リスト1 2 3)リストのリストのすべての要素をどのように返すのですか? (PLTスキーム)

なぜdoesnの」このコードは動作しますか?

(define (listoutput mylist) 
    (cond 
    [(empty? mylist) empty] 
    [(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))])) 

(check-expect (listoutput (list (list 1) (list 2) (list 3))) 
       (list 1 2 3) 
+0

をおそらく 'チェックexpect'を、明白なことを指摘して近くに欠けています-paren。 – djhaskin987

答えて

2

あなたは実際にはかなり近いです。次のような質問があります。

listoutputの契約/署名は何ですか?

appendの契約/署名は何ですか?

また、私はあなたの例を最も簡単に構築することをお勧めします。最初のテストに合格したが、第2 1に障害が発生した場合たとえば、

(check-expect (listoutput empty)) ???) 
(check-expect (listoutput (cons (list 1) empty)) ???) 

は、その関数の構造を考えると、問題がどこにあるかについて何を意味するのでしょうか?

0
[(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))])) 

この行には2つのエラーがあります。最も明白なのは(first list)ではなく(first mylist)であるはずです(私はあなたが実際に知っていると誤解していると思いますが)。 2番目は(first mylist)がリストを返すので(リストのリストを取得しているので)、それを追加するために渡す前にlist関数でラップします。結果として、あなたの例では、(list (list 1))という最初の呼び出し時に(list 1)appendに渡すことはありません。その式から関数listを削除するだけです。あなたがflatten手続きのために求めている

0

、これを試してみてください。

(define (flatten lst) 
    (cond ((empty? lst) null) 
     ((not (list? lst)) (list lst)) 
     (else (append (flatten (first lst)) 
         (flatten (rest lst)))))) 

あなたはそれをテストすることができます

(flatten (list (list 1) (list 2) (list 3))) 
> (1 2 3) 
(flatten '(1 (2 (3)) (4))) 
> (1 2 3 4) 
+0

ツリーの作業も平準化されているのですか? –

+0

リストのリストはツリーを形成するので、そうすることができます。なぜあなたはそれをテストしないのですか? –

関連する問題