1

我刚开始学习方案,不太明白为什么这个功能不起作用:

;(define (sort l)
  (define (sorted? l)
    (if (= (length l) 2)            
        ; if simple list:
        (if (< (head l) (tail l)) 
            #t  
            #f) 
        ; if complex list:
        (if (and (< (head l) (head (tail l))) 
                 (sorted? (tail l)))
            #t  
            #f)))

输出:

(排序?(1 0))。. 程序应用:预期程序,给定:1;参数是: 0 (sorted? '(1 0)) 。. <: 期望类型作为第二个参数,给定:(0); 其他论点是:1

球拍,R5RS

4

2 回答 2

1

你用什么方案?在 R5RS(方案标准)中,使用 car 和 cdr 获取头部和尾部。

cdr 会给你 PAIR,而不是 atom。那行得通。

(define (sorted?l) (if (= (length l) 2)
; if 简单列表: (if (< (car l) (cadr l)) #t
#f) ; if 复杂列表: (if (and ( < (head l) (head (tail l))) (排序?(tail l))) #t
#f)))

于 2011-01-25T16:32:04.113 回答
1

这是因为你比较一个整数和一个列表,cadr或者if (< (head l) (head (tail l)))不是if (< (head l) (tail l))在一行之后; if simple list会有更多的机会为你工作。

以下定义对我有用:

(define (sorted? xs)
  (cond
    ((<= (length xs) 1)
     #t)
    ((< (car xs) (cadr xs))
     (sorted? (cdr xs)))
    (else #f)))
于 2011-01-25T16:34:59.657 回答