我必须编写一个旋转列表n次的函数。旋转包括从列表的前端到末尾放置元素。我完全迷失了。任何帮助将不胜感激!
答案 0 :(得分:1)
您需要使用(或自行实施,如果这是针对某个课程而您的作业要求您手动实施所有内容)take
,drop
和append
。
(take lst n)
会返回n
的第一个lst
元素。例如,(take '(1 2 3 4 5) 3)
会返回(1 2 3)
。(drop lst n)
返回n
的第一个lst
元素之后的所有内容。例如,(drop '(1 2 3 4 5) 3)
会返回(4 5)
。(append lst1 lst2)
返回包含lst1
所有元素的列表,后跟lst2
的所有元素。例如,(append '(4 5) '(1 2 3))
会返回(4 5 1 2 3)
。一旦掌握了这些功能,实现旋转功能是微不足道的:
(define (rotate lst n)
(let ((n (modulo n (length lst))))
(append (drop lst n) (take lst n))))
答案 1 :(得分:-2)
基本实现是
(define (rotate lst n)
(cond
[(< n 0)
(error "n is negative")]
[(or (= n 0) (null? lst))
lst]
[else
(rotate (append (cdr lst) (list (car lst)))
(- n 1))]))
所以
(rotate '(a b c d e) 3)
=> '(d e a b c)
(rotate '(a b c) 5)
=> '(c a b)
作为改进,您应该考虑测试(< n 0)
和(null? lst)
,因为这些只需要进行一次。