簡體   English   中英

反轉方案語言中的列表。 錯誤:汽車:違反合同預期:對? 給定:一個

[英]Invert list in Scheme Language. Mistake: car: contract violation expected: pair? given: a

我用 Scheme 語言練習。 我的代碼在Scheme下面,稱為(invert lst)的過程反轉列表lst(lst的任何子列表也應該反轉)。 我最初是沿着這條路走的,但是在最后一個示例中,我的列表反轉(不一致)不一致。

我的代碼:

#lang scheme

(require "project3test.scm") 
(define (invert lst)
  (if (null? lst)
      '()
      (if (not (list? lst))
          lst
          (append (invert (cdr lst))
                  (list (car lst))))))

(test-invert invert)

測試文件“project3test.scm”:

#lang scheme

(provide test-invert)

(define test-invert
  (lambda (x)
    (begin
      (newline)
      (write "Question 5: invert")
      (newline)
      (write (x 'a))(newline)
      (write (x '(1 2 3)))(newline)
      (write (x '(1 2 (3 4) (5 (6 7 (8))) 9)))(newline)
      )))

輸出:

"Question 5: invert"
a
(3 2 1)
(9 (5 (6 7 (8))) (3 4) 2 1)

問題就在這里。 這些數字不是連續的,沒有完全執行。 我的錯誤是什么?

然后我嘗試了另一種方法,但是出現以下錯誤: car: contract violation expected: pair? given: a car: contract violation expected: pair? given: a

#lang scheme

(require "project3test.scm")

(define (inverse ls)
  (cond ((null? ls)
         ls)
        ((list? (car ls))
         (append (inverse (cdr ls))
                 (list (inverse (car ls)))))
        (else
         (append (inverse (cdr ls))
                 (list (car ls))))))

(test-invert invert)

如果我將此代碼與測試文件分開運行,輸出(顯示 ....)它可以正常工作並正確翻轉工作表。

#lang scheme

(define (inverse ls)
  (cond ((null? ls)
         ls)
        ((list? (car ls))
         (append (inverse (cdr ls))
                 (list (inverse (car ls)))))
        (else
         (append (inverse (cdr ls))
                 (list (car ls))))))

(display (inverse '(1 2 (3 4) (5 (6 7 (8))) 9)))

輸出:

  (9 (((8) 7 6) 5) (4 3) 2 1)

我將不勝感激任何建議、任何提示和幫助。

您的錯誤是由以下測試用例之一引起的: (write (x 'a))(newline) a不是列表,因此不能反轉。

當您重寫此測試用例並使用您的inverse函數時,一切似乎都正常:

#lang scheme

(define (test-invert fn)
  (writeln "Question 5: invert")
  (writeln (fn '(a)))
  (writeln (fn '(1 2 3)))
  (writeln (fn '(1 2 (3 4) (5 (6 7 (8))) 9))))

(define (inverse ls)
  (cond ((null? ls) ls)
        ((list? (car ls)) (append (inverse (cdr ls))
                                  (list (inverse (car ls)))))
        (else (append (inverse (cdr ls))
                      (list (car ls))))))

(test-invert inverse)

輸出:

"Question 5: invert"
(a)
(3 2 1)
(9 (((8) 7 6) 5) (4 3) 2 1)

請注意,有一個函數reverse ,它不會反轉嵌套列表,但可用於編寫一個這樣做的函數。

(define (deep-reverse o)
  (if (list? o)
      (reverse (map deep-reverse o))
      o))

(test-invert deep-reverse)

有4種極限情況:

  • 空列表
  • 汽車是一個清單
  • 汽車不是清單
  • 非列表輸入的底部

這是代碼

(define inv
  (lambda (l)
    ((lambda (s) (s s '() l))
     (lambda (s a l)
       (if (null? l)
           a
           (s s
              (cons
               (if (pair? (car l))
                   (inv (car l))
                   (car l))
               a)
              (cdr l)))))))

如果您想以壓縮形式編寫相同的代碼,可以這樣做:

(define inv
  (lambda (l)
    (fold-left (lambda (a x)
                 (if (pair? x)
                     (cons (inv x) a)
                     (cons x a)))
               '()
               l)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM