0

我正在尝试缩放列表中的所有值,其中最大值为 1,最小值为 0。这是我要完成的示例

(check-expect (squash (list 100 90 70 20)) (list 1 0.875 0.625 0)).

如您所见,最大值为 100,因此它的缩放值为 1,最小值 20 被缩小为 0。

为了缩小所有这些值,我正在执行计算 Z=(Li - (smallest-val)) / ((largest-val) - (smallest-val))

其中 Li 是列表中的所有值 (L1, L2, L3 ...)

到目前为止,这是我的代码

(define (squash L)
  (local
    [
     ;;(largest-val M) returns the largest value M in L
     ;;(largest-val: (listof Num) -> Num
     (define (largest-val M) (foldr max (first M) (rest M)))

     ;;(smallest-val x) returns the smallest value x in L
     ;;(smallest-val: (listof Num) -> Num
     (define (smallest-val x) (foldr min (first x) (rest x)))
     ]
    (cond
      [(empty? L)'()]
      [else (cons (/ (- (first L) smallest-val) (- largest-val smallest-val))
                   (squash (rest L)))])))

这是我得到的错误

:: -: 期望一个数字作为第二个参数,给定 (lambda (a1) ...)

我不确定如何修复此代码,以便我的程序正常工作

我想使用命令式编程范例来保留我的解决方案,因此我更愿意将我的答案保持与现在相同的格式。

4

2 回答 2

1

在内部local,您将largest-valand都定义smallest-valprocedure,但在实际的主体中,squash您并没有调用它们,而是将它们当作数字来使用;这就是-: expects a number as 2nd argument, given (lambda (a1) ...)错误的含义。

不过,还有一个更严重的问题。您似乎打算在每次迭代时计算最小值和最大值,但这会产生不正确的结果。您必须只计算一次这些值- 如果我们定义一个辅助过程会更容易,如下所示:

(define (squash L)
  (squash-helper L (apply min L) (apply max L)))

(define (squash-helper L minL maxL)
  (cond [(empty? L) '()]
        [else (cons (exact->inexact (/ (- (first L) minL) (- maxL minL)))
                    (squash-helper (rest L) minL maxL))]))

我曾经exact->inexact摆脱分数,有一种更简单的方法可以使用与 和 一起找到列表的最小值和apply最大值。现在程序按预期工作:minmax

(squash (list 100 90 70 20))
=> '(1.0 0.875 0.625 0.0)
于 2019-07-30T22:01:31.823 回答
1

这是您的功能的变体:

(define (squash L)
  (local
    [
     ;;(largest-val M) returns the largest value M in L
     ;;(largest-val: (listof Num) -> Num
     (define (largest-val M) (foldr max (first M) (rest M)))

     ;;(smallest-val x) returns the smallest value x in L
     ;;(smallest-val: (listof Num) -> Num
     (define (smallest-val x) (foldr min (first x) (rest x)))
     (define (scale x)
       (/ (- x                 (smallest-val L))
          (- (largest-val  L)  (smallest-val L))))]
    (map scale L)))

该函数将该函数map应用于scale列表的每个元素,L并返回一个包含所有结果的新列表。

于 2019-07-30T22:31:14.267 回答