2

私は実際のスキームの初心者であり、リスト引数で指定されたすべてのサブリストを返す方法を見つけようとしています(つまり、(1 2(3 4 5)(6 7 8)9)は2つのリストを返す必要があります(3 4 5)および(6 7 8))。

リストの残りの部分で再帰関数を使用する必要があることはわかっていますが、必要な結果を生成するのに問題があります。これが私が書いたものです:-

(define (find-sublists list)
  (cond
   ((null? list) #t))
  (not
   (list? (first list)))
  (print (first list))
  (find-sublists (rest list)))

リストを検索して、リストであるものをすべて出力してから再度検索しようとしています。それ以外の場合は、リストの残りの部分を再帰的に検索します。ただし、条件が満たされたときに最後の行に直接ジャンプする方法がわかりません。

誰かアドバイスはありますか?

4

2 に答える 2

4

まず、これは宿題だと思います。私が間違っている場合は修正してください。

次へ: あなたはこの問題について 1 つの致命的な誤解をしているように見えます: 2 つのリストを印刷するのではなく、返却するように求めているのです。

次に、How To Design Programsのデザイン レシピに進みます。最初のステップは、作業しているデータ定義を書き留めることです。ここに何があるかはよくわかりませんが、次のようなものかもしれません。

;; a list-of-maybe-lists is either
;; - empty, or 
;; - (cons maybe-list list-of-maybe-lists)

;; a maybe-list is either
;; - a list, or
;; - something else

次のステップは、契約書とプログラムの目的ステートメント、そしていくつかのテスト ケースを書き留めることです。

ボイラープレート: 答えではなく、多くの小さな手順を提供することをお許しください。これらすべてのステップのポイントは、他の人があなたのために釣りをするのを待つのではなく、自分で釣りをできるようにすることです.

于 2012-01-09T19:26:29.497 に答える
1

特定のリスト内のすべてのリストを除外するだけの場合は、次を使用しますfilter

(filter list? '(1 2 (3 4 5) (6 7 8) 9))

または、自分で実装します。

(define (my-filter func lst)
  (cond ((null? lst) '())
        ((func (car lst))
         (cons (car lst) (my-filter func (cdr lst))))
        (else
         (my-filter func (cdr lst)))))
于 2012-01-12T08:24:21.063 に答える