我遇到了一个练习题,要求我使用'let'和'map'来简化递归函数。
原始函数(最大数字)将列表作为输入并输出该列表中的最大数字。 (例如:(最大数字(列表1 2 3)) - > 3 这是原始函数的代码。
(define (biggest-number list1)
(cond
[(empty? (rest list1)) (first list1)]
[(cons? (rest list1))
(if (> (first list1) (biggest-number (rest list1)))
(first list1)
(biggest-number (rest list1)))]))
我只是找不到使用map的lambda函数。 这就是我到目前为止所做的事情,这是非常错误的,并使原件恶化。
(define (simple-max list1)
(cond
[(empty? (rest list1)) (first list1)]
[(cons? (rest list1))
(let ((test (lambda (number) (if (> number (simple-max (rest list1)))
number
(simple-max (rest list1))))))
(map test list1))]))
我想首先找到一个可以替换'if'语句的lambda函数,然后使用'let'将变量赋给lambda方程。有人可以帮助我进行思考过程以获得lambda函数吗?
答案 0 :(得分:3)
我不知道如何使用map
来简化catamorphic function(即将数据结构折叠成值的函数)。在您的情况下,您将列表折叠为该列表中最大的数字:
biggest-number :: [Int] -> Int
您无法使用map
,因为地图是一种保留操作的结构:
map :: (a -> b) -> [a] -> [b]
您需要使用foldl
:
foldl :: (b -> a -> b) -> b -> [a] -> b
这就是我写它的方式:
(define (max x y) (if (> x y) x y))
(define (biggest-number list) (foldl max (car list) (cdr list)))
简单而简洁。