1
(define fun4

 (lambda ( ls)

(cond ((null? ls ) #f)

 (cons (((eqv? 'a (car ls))) && ((eqv? 'b (cdr ls)))))

(else (pattern2 cdr ls)))))

これでエラーが表示されます - プロシージャ アプリケーション: 予想されるプロシージャ、与えられた: #t (引数なし)、私のコードのエラーは何ですか。ロジックは大丈夫ですか?

4

3 に答える 3

2

ソリューションには非常に多くのエラーがあります。それぞれの条件で何が問題なのかを見てみましょう。

  1. 再帰の基本ケース (空のリスト) が間違っています: 空のリストは再帰の出口であり、リストが正しくトラバースされ、パターンに従っていることを意味します
  2. もう 1 つの基本的なケースが欠落しています。リストに要素が 1 つしかない場合はどうなるでしょうか。
  3. パターンが成り立たない場合は、#fすぐに戻りcadr、2 番目の要素へのアクセスに使用する方法に注意する必要があります。&&これは、Scheme では機能しないandため、論理演算に使用する必要があります。また、各テストを囲む不必要で誤った括弧があります(ちなみに、これらは「予期される手順」エラーの原因となったものです)
  4. 上記の条件のいずれにも当てはまらない場合にのみ、再帰を進めます。これは、 を使用して2 つの要素をリストのさらに下に移動することによって行いますcddrfun4また、再帰を進めるために呼び出す必要があります。pattern2

これは問題を解決する正しい方法です。上記の問題がどのように対処されたかに注意してください。

(define fun4
  (lambda (ls)
    (cond ((null? ls) #t)                                       ; 1
          ((null? (cdr ls)) #f)                                 ; 2
          ((not (and (eq? 'a (car ls)) (eq? 'b (cadr ls)))) #f) ; 3
          (else (fun4 (cddr ls))))))                            ; 4

常に手順をテストしてください。上記は正しく機能します。

(fun4 '())
=> #t
(fun4 '(a))
=> #f
(fun4 '(a b))
=> #t
(fun4 '(a b a))
=> #f
(fun4 '(a b a b))
=> #t

最後の注意として、空のリストがパターンに従っていないと想定されている場合は、呼び出す前にチェックして、最初の入力リストが空であるかどうかfun4を返します。#f

于 2013-10-16T01:15:59.680 に答える
0

非常に多くの車輪の再発明。SRFI 1 を使用するだけです。

(require srfi/1)
(define (fun4 lst)
  (every eq? lst (circular-list 'a 'b)))

(a b a)(これは、無効ではなく有効であるという仮定の下で動作します。)

于 2013-10-17T19:43:14.740 に答える
0
(define fun 
  (lambda (ls)
    (cond ((null? ls) #t)
          ((and (eq? (car ls) 'a)       ; the first item is a
                (list? (cdr ls))        ; the rest of the list
                (not (null? (cdr ls)))  ; which is not null
                (eq? (cadr ls) 'b)      ; and it starts with b
                (fun (cddr ls))) #t)    ; and the rest of the expression is 
          (else #f))))                  ; also in the A B format

ランニング:

> (fun '(a b a b))
#t
> (fun '(a b a))
#f
> (fun '(a b))
#t
> (fun '(a))
#f
> (fun '())
#t
> 
于 2013-10-16T01:56:13.993 に答える