2011-09-01 6 views
0

Common Lispの入れ子リストは本当に私を混乱させました。ここで問題がある:再帰を使用することによりCLISPの入れ子リストとラムダ式のいくつかの問題がありました

、最初の引数がそうでなければ( ネストされたリストかもしれない)第二引数に表示され、nil場合(nested-list 'b '(a (b c) d))リターンt をしましょう。

私はfindを試しましたが、最初の引数が'(b c)の場合にのみ動作します。 私はラムダ式に目を向けました。最初に第2の 引数を平坦化してから、eqを使用して引数を比較したいと思います。

(defun nested-list (x y) 
    (cond  
    ((null y)())  
    (t (append (lambda (flatten) (first y)) 

それから私は立ち往生しました。私はラムダ のexpaysについてたくさんのものを読んでいましたが、それでも私は混乱しました。 私はfuncall関数を知っていましたが、私はちょうど を得ることができないことを知っています。私はCommon Lispを5日間学んだので、 ヒントを教えてください。どうもありがとう!

+2

その関数の名前は非常に悪いです。 'tree-contains-p'のようなものでなければなりません。 – Svante

答えて

2

まず第一に、あなたはif代わりのiff問題がちょうどtを返す、非常に簡単です、あなたは、あなたは、多くの場合、再帰のアイデアを使用して問題を解決する必要があるときに真剣に代わり話す

:-)終わっを入力ミスしない限り、単純です:

  1. 我々は些細なケースにしている場合だけ答え
  2. を返すそれ以外の答えは、我々はこのことを、それは少し簡単です、問題を解くことによって取得したい同じ答えで、我々はゾルに自分自身を呼び出すこの単純化されたバージョン。具体的には

は考慮してください。

  1. 2番目の引数が空リストの場合は最初の引数がその後、ちょうどTを返す二番目の引数の最初の要素に等しい場合の答えはNIL
  2. です代わりに
  3. もしそうでなければ、2番目のリストの最初の要素がリスト(それ故におそらくネストされたリスト)であり、要素がこのマルチリストに含まれていればtrueを返します(このケースをチェックするには関数自身を呼び出しています)
  4. ことが確認されたため、1と2は些細な例ですので、基本的に(これも再帰的に同じ機能を呼び出す)、

をそれ以外の場合はちょうど同じ問題をチェックしますが、第一、第二引数の最初の要素を削除します; 3と4は、問題のより簡単なバージョンを解決する場合です。

+0

ありがとう、私はこの問題をどう対処するかは不明です。私は慎重にあなたの提案を読んで、私はまだコードに絡まっています。ちょうど私がそれを計画する方法を知っているように、しかし適切な実装をする方法を知らない – roccia

関連する問題