2017-11-02 10 views
0

私はリストの深さを教えてくれる手続きをしようとしています。 これは私がこれまで持っているものである:これは、うまく動作しますラケットのリストの奥行きを調べる

(define (depth lst) 
    (let recurse ((lst lst) (n 1)) 
    (cond ((null? lst) '()) 
      ((not (pair? (car lst))) 
      (cons n (recurse (cdr lst) n))) 
      (else 
      (append (recurse (car lst) (+ 1 n)) 
        (recurse (cdr lst) n)))))) 

が、それは数の代わりに結果を含むリストとしての深さを返します。たとえば、(depth '(((a))))を実行すると、3の代わりに(3)が返されます。

答えて

0

最も簡単な答えは、をletフォームに電話するだけです。ここでは(私はあなたのコードを再フォーマットの自由を取られ、depth機能のシャドウイングを修正しました)それは次のようになります。

(define (depth lst) 
    (car (let recurse ((lst lst) (n 1)) 
     (cond ((null? lst) '()) 
       ((not (pair? (car lst))) 
       (cons n (recurse (cdr lst) n))) 
       (else 
       (append (recurse (car lst) (+ 1 n)) 
         (recurse (cdr lst) n)))))))) 

しかし、質問の主旨にならないこと。この場合、関数は実際には思っているよりもうまく機能しています。

> (depth '((((a))))) 
'(4) 
> (depth '((((a))) ((b)) (c))) 
'(4 3 2) 

、これは本当に実際にある:ので、ここでそれと対話することはREPLで次のようになります(ただし、外側のリストを含む)あなたのトップレベルのリストに含まれているリストの深さを与えています有益で興味深い振る舞いですが、それがあなたが望むものでない場合は、関数全体を書き直す必要があります。ここで私はそれを書く方法です。私は第一および第二のものを組み合わせた場合condが一つ少なく腕を持っている可能性がありますが、それは好みの問題だ:これは、はるかに短いくら​​いです、そしてあなたはまだ同じ結果を得ることができることを

(define (depth lst) 
    (cond 
    [(empty? lst) 0] 
    [(not (pair? lst)) 0] 
    [else (+ 1 (depth (car lst)))])) 

お知らせ

(define (depth-many lst) (+ 1 (map depth lst))) 

いずれにしても、新しい深度関数(深さ-prime?)には引数があります。それが空であるか非リスト項目であれば、それは最下位にあるので、もう何もする必要はありません。それ以外の場合(リスト引数があることを意味します)、リストの carを呼び出すと、carの最初の要素を取得し、その結果に1を加算します。

希望に役立ちます!

+0

どのように地球上であなたはとてもシンプルにしましたか??????これは心が吹いている。再度、感謝します! –

+0

違いは、あなたの関数が全ての場所で奥行き検索と奥行き検索の両方を行うという、すべてのロジックを1つの場所にまとめて、効果的に 'map'をプロセス内で再実装するということでした。私が 'map'を再実装して、すべてのコードを1か所に置くと、実際にはもっと複雑になっているかもしれません。鍵は、必要がなくても再実装することがなく、より小さくて抽象的な断片に分割することです。あなたが書いている間https://docs.racket-lang.org/reference/pairs.htmlを開いたままにすることをお勧めします。 –

関連する問題