0

リストがアトムとサブリストの間で交互になっているかどうかを検出する関数を作成する必要があります。たとえば、リストが (a (bc) d (ef)) の場合は true を返し、リストが (ab) の場合は false を返します。

これは私がこれまでに持っているものです:

(define (altlist? lis)
(cond
((null? lis)#t)
((null? (cdr lis))#t)
((list? (car lis))
 (not(list? (cadr lis)
            (altlist? cdr lis)
           '() )
     (list? (cadr lis)
            (altlist? cdr lis)
           '())
     ))))
4

3 に答える 3

0

どうぞ:

(define (alt-list? l)
  (or (null? l)
      (and (not (null? (cdr  l)))
           (not (list? (car  l)))  ; atom
           (list? (cadr l))        ; list
           (alt-list? (cddr l)))))

正確なコードは、以下が「代替リスト」であるかどうかによって異なります。

  1. '(あいうえお)
  2. '((ab)c)

私が提供したコードは(アトムリスト)を期待しています* => #t

于 2013-03-10T18:06:14.280 に答える
0

これがあなたのコードです。いくつかの括弧が移動され、いくつかのコメントとインデントが追加され(読みやすくするために)、いくつかの修正が加えられています。

(define (altlist? lis)
  (cond
    ((null? lis) #t)                  ; end-of-list successfully reached
    ((null? (cdr lis)) #t)            ; ditto
    ((list? (car lis))                ; first elt is a list
      (and (not (list? (cadr lis)))   ; fixed: use AND
           (altlist? (cdr lis))))
    (else                             ; fixed: ELSE clause
      (and (list? (cadr lis))         ; fixed: use AND
           (altlist? (cdr lis))))))

だからあなたは近かった。コードを書き留める際には注意してください。

ここで微妙な点が 1 つあります。(list? '())true を返します。空のリストをリストではなくアトムと見なしたい場合は、代わりにlist?を使用できますpair?

于 2013-03-11T13:53:57.063 に答える
0

関数は単一の引数list?を受け入れ ( http://www.r6rs.org/final/html/r6rs/r6rs-ZH-14.html#node_sec_11.1を参照)、3 番目の節で何を意味したのか理解できません。notcond

一方、ソリューションはさらに短くなります。

(define (altlist? lis)
  (cond
   ((null? lis) #f)
   ((null? (cdr lis)) #f)
   ((not
     (eq? (list? (cadr lis))
          (list? (car lis))))
    #t)
   (#t (altlist? (cdr lis)))))

アイデアは、指定されたリストの後続のペアを次々とチェックすることです。そして、それぞれについて、両方がリストであるか、両方がアトムであるかを比較します。リストにリストとアトムが含まれている場合、(リスト アトム) または (アトム リスト) のペアが存在し、その逆も同様です。

編集:

@molbdniloが指摘したように、元の関数は実際にリストが交互になっていないかどうかをチェックしようとしています。

編集:

代替リストは、リストとアトムの両方を含む単なるリストではないことがわかりました。GoZoner ソリューションを見てください。現在の実装は、指定されたリストに存在するアトムとコンスをチェックするだけです。

于 2013-03-10T17:15:15.373 に答える