我有一个关于在方案中找到一组列表中最大列表的问题。
例如,我们定义: (定义manylsts(列表(列表9(列表8 7))6(列表5(列表4 3 2)1)))
我如何找到动画片中最大的列表? 谢谢
答案 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家庭作业的一种非常方便的方式。