スキームのリストから最も長いサブリストのサイズを取得します

functional-programming racket scheme
スキームのリストから最も長いサブリストのサイズを取得します

リストから最も長いサブリストのサイズを取得したいと思います。

例えば

(getlongest((a)b(d e m n)(a d(c m g c y u m l d)a)))

(c m g c y u m l d)のサイズは9であるため、9を返します。

この関数を書きました

(define getlongest
  (lambda (ls)
    (cond
     ((null? ls)0)
     (else
      (cond
        ((atom? (car ls))
       (+ 1 (getlongest (cdr ls))))
         (else
          (max (getlongest(car ls)) (getlongest(cdr ls)))))))))

しかし私が書いたら

(getlongest((a)(a(d d d e)m)))

5。 誰でもこれを修正するのを手伝ってくれますか?

ありがとう

  0  1


ベストアンサー

したがって、コードの問題は、リストのサブリストが実際に最長であることがわかったとしても、すでにカウントしたリストの一部に対して1つの長さをカウントしていることです。 たとえば、この場合もコードは5を返します: (getlongest '(a(b(c(d(e)))))

あなたのアプローチは簡単に修正するのが難しいです。 再帰するときは、より多くのデータを渡す必要があると思います。 「getlongest」を呼び出すたびに現在の長さがわかっていれば、適切な最大値を取得できるはずです。

これが宿題でない場合、ここに私が本能的に同じ関数を書く方法を示します(可能な限り効率的ではなく、単純です:)

(define (get-longest x)
  (cond ((null? x) 0)
        ((atom? x) 1)
        ; else take either the length of this list, or of the longest sub-list
        (else (apply max (length x) (map get-longest x)))))

1


タイトルとURLをコピーしました