给定索引列表重新排列列表
Rearrange a list given a list of indices
(rearrange-this '(4 (4 2) 1) '(a b c d)) -> (d (d b) a)
所以我需要这个来递归到子列表中并重新排列它们。
(define (rearrange-this list1 list2) ;Initial function
(rearrange-r list1 list2 (count list1) '() list1))
;list 1 holds numbers, list2 hold letters
(rearrange-this '(4 3 2 1) '( a b c d )) ;-> outputs (d c b a)
(rearrange-this '(2 3 4 1 3 2 1 4) '(a b c d)) ;-> outputs (b c d a c b a d)
您想尽可能使用高阶函数。列表操作中最重要的是:map
、fold
、filter
和 list-tabulate
。学会这些会节省很多时间。
map
在这种情况下非常有用。我用它编写了一个 deep-map
函数,该函数深入子列表并对其中的对象应用操作,但如果您想将列表映射到其他内容,它就不起作用,因为 deep-map
会深入这些列表.您必须将此类列表包装在某些东西中才能使 list?
检查失败。
写完deep-map后,我用list-ref
到selectvalue-list
中的适当元素并替换arrangement
中的数字。
(define (deep-map operator deep-list)
(map
(lambda (element)
(if (list? element)
(deep-map operator element)
(operator element)))
deep-list))
(define (rearrange-this arrangement value-list)
(deep-map
(lambda (element)
(list-ref value-list element))
arrangement))
这里是代码的快速测试。请注意,与您的代码不同,列表位置从 0 开始。如果您希望输入引用从 1 开始,您可以 map
输入排列列表。我将把它作为练习留给您。
> (rearrange-this '(3 2 (1 0)) '(a b c d))
;Value 16: (d c (b a))
(rearrange-this '(4 (4 2) 1) '(a b c d)) -> (d (d b) a)
所以我需要这个来递归到子列表中并重新排列它们。
(define (rearrange-this list1 list2) ;Initial function
(rearrange-r list1 list2 (count list1) '() list1))
;list 1 holds numbers, list2 hold letters
(rearrange-this '(4 3 2 1) '( a b c d )) ;-> outputs (d c b a)
(rearrange-this '(2 3 4 1 3 2 1 4) '(a b c d)) ;-> outputs (b c d a c b a d)
您想尽可能使用高阶函数。列表操作中最重要的是:map
、fold
、filter
和 list-tabulate
。学会这些会节省很多时间。
map
在这种情况下非常有用。我用它编写了一个 deep-map
函数,该函数深入子列表并对其中的对象应用操作,但如果您想将列表映射到其他内容,它就不起作用,因为 deep-map
会深入这些列表.您必须将此类列表包装在某些东西中才能使 list?
检查失败。
写完deep-map后,我用list-ref
到selectvalue-list
中的适当元素并替换arrangement
中的数字。
(define (deep-map operator deep-list)
(map
(lambda (element)
(if (list? element)
(deep-map operator element)
(operator element)))
deep-list))
(define (rearrange-this arrangement value-list)
(deep-map
(lambda (element)
(list-ref value-list element))
arrangement))
这里是代码的快速测试。请注意,与您的代码不同,列表位置从 0 开始。如果您希望输入引用从 1 开始,您可以 map
输入排列列表。我将把它作为练习留给您。
> (rearrange-this '(3 2 (1 0)) '(a b c d))
;Value 16: (d c (b a))