1

スキームで回文リストを検出しようとしています。これが私のコードです:

;- Input : Takes only one parameter named inSeq
;- Output : It returns the reverse of inSeq if inSeq is a sequence.
; Otherwise it produces an error.
;- Examples :
; (reverse-sequence '(a b c)) --> evaluates to (c b a)
; (reverse-sequence '()) -------> evaluates to ()
(define reverse-sequence
 (lambda (inSeq)
   (if (sequence? inSeq)
       (if (null? inSeq) 
           inSeq 
           (append (reverse-sequence (cdr inSeq))
                   (list (car inSeq)))))))

;- Input : Takes only one parameter named inSeq
;- Output : It returns true if inSeq is a sequence and it is a palindrome.
; It returns false if inSeq is a sequence but not a plaindrome.
; Otherwise it gives an error.
;- Examples :
; (palindrome? '(a b a)) --> evaluates to true
; (palindrome? '()) -------> evaluates to true
; (palindrome? '(a 1 a)) --> produces an error
(define palindrome
 (lambda (inSeq)
   (if (sequence? inSeq) 
       (if (equal? reverse-sequence(inSeq) inSeq ) 
           #t 
           #f))))

入力 '(aba) を試すと、次のエラーが表示されます。

The object (a b a) is not applicable

誰でもこのエラーで私を助けることができますか? ありがとう

4

2 に答える 2

3

あなたが書いた

(equal? reverse-sequence(inSeq) inSeq )

(inSeq)引数なしの関数として呼び出そうとします。それは読むべきです:

(equal? (reverse-sequence inSeq) inSeq )
于 2013-04-30T19:10:49.387 に答える
2

スキームでは、f引数でプロシージャを呼び出す正しい方法xは次のとおり(f x)です。このスニペットが機能しない理由は次のとおりです。

reverse-sequence(inSeq)

次のようになっているはずです。

(reverse-sequence inSeq)

受け取った引数がsequenceでない場合、void値が返され、正しい答えが得られないという問題が発生することに注意してください。また、組み込みreverse手続きを使うこともできたのですが、自分で実装したいのではないでしょうか? それを念頭に置いて、結果をパラメータに蓄積するリストを逆にする (末尾再帰) 方がよいので、append結果 (これは高価です) を必要とせず、結果だけcons(非常に安価です) を求めます。これが私が意味することです:

(define (reverse-sequence inSeq)
  (if (not (sequence? inSeq))
      '()  ; can't reverse if it's not a sequence
      (let loop ((inSeq inSeq)
                 (reversed '()))
        (if (null? inSeq)
            reversed
            (loop (cdr inSeq) (cons (car inSeq) reversed))))))

(define (palindrome inSeq)
  (if (not (sequence? inSeq))
      #f
      (equal? inSeq (reverse-sequence inSeq))))
于 2013-04-30T19:16:38.863 に答える