-1
(define depth-count
  (lambda (l)
    (let ((visited '())
          (counter 0))
      (let iter ((l l))
         (cond ((pair? l) 
                (if (memq l visited)
                    (set! counter (+ 1 counter))
                    (begin
                       (set! visited (cons l visited))
                       (iter (car l))
                       (iter (cdr l)))))
               (else '()))) counter)))

私見、そのelseブランチは不要か間違っているだけですが、そのコードは機能しているようですが、よくわかりません..

(define l0 '(a b c))
(set-car! l0 l0)
(set-car! (cdr l0) l0)
(depth-count l0)

2を返すはずですよね?では正しいですか?

4

1 に答える 1

0

(else '())その表現が余計だというのは正しい。これは、cond式が空のリストに評価される場合があることを意味します。したがって、内部のletが空のリストに評価されることがあります。

インナーレットの結果を何にも使用していないため、余分です。結果は外側のletによって破棄され、最後のサブ式の値が返されます: counter

はい、2 は、提案した入力の妥当な (予測可能な) 結果です。

その正確さに関しては、達成しようとしていることをより明確に述べる必要があります。「循環リスト」の「深さ」は明確に定義された概念ではありません。

于 2014-05-18T21:36:15.017 に答える