0

現在、ポイント p からポイント リスト内のポイント p から最も離れたポイントまでの距離を返すポイント リストから関数を作成しようとしています。私のポイントのリストは次のとおりです。

((2 . 4) (3 . 6) (5 . 12) (-4 . 3) (8.4 . 9) (0 . -1))

また、リスト自体の car と cdr だけでなく、一般的な car と cdr (コードでの可視性を高めるため) を取得するための抽象化も行いました。

(define (get-x p) (car p)
(define (get-y p) (car p)


(define (get-first-point pt-list)
        (get-x pt-list))

(define (get-rest-points pt-list)
        (get-y pt-list))                                                                                         

また、選択した任意の 2 点に使用できる一般化された距離の公式も既に書きました (car と cdr をそれぞれ get-x と get-y に抽象化したことに注意してください)。

(define (distance a b)
    (if (or (null? a) (null? b))
        0
        (sqrt (+ (expt (- (get-x a)
                          (get-x b))  2) 
                 (expt (- (get-y a) 
                          (get-y b))  2)))))

これで、一連のポイント全体でさまざまな距離を比較し、最大の戻り値を選択する必要があることがわかりました。私は部分的な解決策を持っていますが、すべての点で正しい解決策ではありません。

(define (max-distance p pt-list)
    (if (null? pt-list)
        0
        (max (distance p (get-first-point pt-list)) ; 1
             (distance p (get-first-point (get-rest-points pt-list))) ; 2
             (distance p (get-first-point (get-rest-points (get-rest-points pt-list)))) ; 3
             (distance p (get-first-point (get-rest-points (get-rest-points (get-rest-points pt-list))))) ; 4
             (distance p (get-first-point (get-rest-points (get-rest-points (get-rest-points (get-rest-points pt-list)))))) ; 5
             (distance p (get-first-point (get-rest-points (get-rest-points (get-rest-points (get-rest-points (get-rest-points pt-list))))))) ; 6
    )
)

)

おそらく、私が(恐ろしく)やろうとしていることの要点を理解できるでしょうが、これが私が助けを必要とする理由です.

4

3 に答える 3

1

get-y使用cdrしないでcarください。

get-xget-y閉じ括弧がありません。

のためmax-distanceに、私は行きます

(define (max-distance p pt-list)
  (apply max (map (lambda (x) (distance p x)) pt-list)))

つまり、 and は必要get-first-pointありませんget-rest-points

図 ((1 . 1) を p として使用):

> (map (lambda (x) (distance '(1 . 1) x)) '((2 . 4) (3 . 6) (5 . 12) (-4 . 3) (8.4 . 9) (0 . -1)))
'(3.1622776601683795 5.385164807134504 11.704699910719626 5.385164807134504 10.897706180660222 2.23606797749979)

> (apply max (map (lambda (x) (distance '(1 . 1) x)) '((2 . 4) (3 . 6) (5 . 12) (-4 . 3) (8.4 . 9) (0 . -1))))
11.704699910719626

「最も遠い」の定義によってはabs、式に含めることができます。

于 2013-10-23T09:14:25.600 に答える