Recursion 如何使用';让';和';地图';简化racket中的递归函数?

Recursion 如何使用';让';和';地图';简化racket中的递归函数?,recursion,lambda,racket,Recursion,Lambda,Racket,我被困在一个实践问题上,这个问题要求我使用“let”和“map”来简化递归函数 原始函数(最大数)将列表作为输入,并输出该列表中的最大数。(例如:(最大数字(列表1、2、3))->3 这是原始函数的代码 (define (biggest-number list1) (cond [(empty? (rest list1)) (first list1)] [(cons? (rest list1)) (if (> (first list1) (biggest-num

我被困在一个实践问题上,这个问题要求我使用“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)))]))
我只是找不到一个lambda函数来使用map。 这是我到目前为止所做的,这是非常错误的,并使原来的情况恶化

(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))]))

首先,我想找到一个lambda函数来替换“if”语句,然后使用“let”为lambda方程分配一个变量。有人能帮助我思考获得lambda函数的过程吗?

我不知道如何使用
map
来简化计算(即,将数据结构折叠为值的函数)。在您的情况下,您将列表折叠为该列表中最大的数:

最大号码::[Int]->Int
不能使用
map
,因为map是一种结构保留操作:

map::(a->b)->[a]->[b]
您需要使用以下操作将列表折叠为值:

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)))

简单明了。

谢谢!我现在对地图的理解好多了。我会继续解决这个问题的!