查找列表中列表定义中的最大列表?

时间:2015-07-19 20:22:47

标签: scheme racket

我有一个关于在方案中找到一组列表中最大列表的问题。

例如,我们定义: (定义manylsts(列表(列表9(列表8 7))6(列表5(列表4 3 2)1)))

我如何找到动画片中最大的列表? 谢谢

2 个答案:

答案 0 :(得分:0)

如果它的参数不是列表,则创建一个计算结果为零的过程。 (例如。9),如果它是一个列表,你foldl使用参数的length作为累加器,lambda之间的max使用累加器递归第一个参数。它看起来像这样:

(define (max-children tree)
  (if <??>
      (foldl (λ (x acc)
               (max <??> (max-children <??>))) 
             (length <??>)
             <??>)
      0))

当然有很多方法可以做到这一点,包括显式递归,但这是我的第一件事。

答案 1 :(得分:0)

我会在你问这个问题时回答这个问题。

你说你想要

  

找到manylsts中最大的列表

由于您在manylsts中包含了一个未列出的元素,因此您希望有一个定义来告诉您元素的大小(如果是列表)。

所以我编写了函数elemenlen,如果给定的元素列表,则返回列表的长度,否则返回0。

(define elemenlen
  (λ (a)
    (if (list? a) (length a) 0)
    ))

然后我决定按照长度顺序对它们进行排序,然后返回第一个元素。因此,我需要一个返回boolean值的函数,以便将其与sort中包含的racket/base函数一起使用。

(define list<
  (λ (listA listB)
    (< (elemenlen listA) (elemenlen listB))))
(define list>
  (λ (listA listB)
    (not (list< listA listB))))

如果#t小于listA,则第一个函数返回listB。如果#t大于listA,则第二个函数返回listB

最后,biggestElement完成整个技巧,按降序排列列表L中的元素(基于长度)并返回第一个元素。

(define biggestElement
  (λ (L)
    (car (sort L list>)
         )))

该功能使用如下:

>(biggestElement  '((3 2 1) 1 (1 (2 3) 3))
'(1 (2 3) 3)

这只是一种做法,还有其他方法可以做到这一点,继续保持并告诉我们它是否对你有帮助。

如你所见,我将这个大问题分解成小问题。这是做DrRacket家庭作业的一种非常方便的方式。