如何缩放最大值为 1 最小值为 0 的列表中的所有值
How do I scale values all the values in a list where the largest value is 1 and the smallest value is 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) ...)
我不确定如何修复此代码以使我的程序正常运行
我想使用命令式编程范例来保留我的解决方案,所以我更愿意以与现在相同的格式保留我的答案。
在 local
中,您将 largest-val
和 smallest-val
都定义为 过程 ,但在 [=15= 的实际正文中] 你不是 调用 它们,而是像使用数字一样使用它们;这就是 -: 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
以及 min
和 [= 有一种更简单的方法来查找列表的最小值和最大值20=]。现在程序按预期运行:
(squash (list 100 90 70 20))
=> '(1.0 0.875 0.625 0.0)
这是您的函数的变体:
(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
和 returns 包含所有结果的新列表。
我正在尝试缩放列表中的所有值,其中最大值为 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) ...)
我不确定如何修复此代码以使我的程序正常运行
我想使用命令式编程范例来保留我的解决方案,所以我更愿意以与现在相同的格式保留我的答案。
在 local
中,您将 largest-val
和 smallest-val
都定义为 过程 ,但在 [=15= 的实际正文中] 你不是 调用 它们,而是像使用数字一样使用它们;这就是 -: 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
以及 min
和 [= 有一种更简单的方法来查找列表的最小值和最大值20=]。现在程序按预期运行:
(squash (list 100 90 70 20))
=> '(1.0 0.875 0.625 0.0)
这是您的函数的变体:
(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
和 returns 包含所有结果的新列表。