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 (ソート済み? '(1 0)) 。. <: 次の場合、2 番目の引数として型が必要です: (0); その他の引数: 1

ラケット、R5RS

4

2 に答える 2

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 に答える
1

どのようなスキームを使用しますか? R5RS (スキーム標準) では、car と cdr を使用して head と tail を取得します。

そして、cdrはatomではなくPAIRを提供します。それは働いています。

(define (sorted? l) (if (= (length l) 2)
; 単純なリストの場合: (if (< (car l) (cadr l)) #t
#f) ; 複雑なリストの場合: (if (and ( < (head l) (head (tail l))) (sorted? (tail l))) #t
#f)))

于 2011-01-25T16:32:04.113 に答える