方案旋转功能

时间:2014-01-22 04:30:06

标签: list rotation scheme

我必须编写一个旋转列表n次的函数。旋转包括从列表的前端到末尾放置元素。我完全迷失了。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您需要使用(或自行实施,如果这是针对某个课程而您的作业要求您手动实施所有内容)takedropappend

  • (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),因为这些只需要进行一次。