繁体   English   中英

如何使用'let'和'map'来简化球拍中的递归函数?

[英]How to use 'let' and 'map' to simplify a recursive function in racket?

我陷入了一个练习问题,需要我通过使用'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函数吗?

我不知道如何使用map来简化变形函数即将数据结构折叠成值的函数)。 在您的情况下,您将列表折叠到该列表的最大数量:

biggest-number :: [Int] -> Int

您不能使用map因为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)))

简洁而简洁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM