List 方案旋转函数

List 方案旋转函数,list,rotation,scheme,List,Rotation,Scheme,我必须编写一个函数,将列表旋转n次。旋转包括将元素从列表的前端放置到末尾。我完全迷路了。任何帮助都将不胜感激 如果这是一门课程,而您的作业要求您手工完成所有内容,则您需要使用或实施自己,包括:获取、删除和附加 take lst n返回lst的前n个元素。例如,“123453”返回1233。 drop lst n返回lst的前n个元素之后的所有内容。例如,drop'123453返回45。 append lst1 lst2返回一个列表,其中包含lst1的所有元素,后跟lst2的所有元素。例如,app

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

如果这是一门课程,而您的作业要求您手工完成所有内容,则您需要使用或实施自己,包括:获取、删除和附加

take lst n返回lst的前n个元素。例如,“123453”返回1233。 drop lst n返回lst的前n个元素之后的所有内容。例如,drop'123453返回45。 append lst1 lst2返回一个列表,其中包含lst1的所有元素,后跟lst2的所有元素。例如,append'45'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))))

一个基本的实施将是

(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))]))

作为一种改进,您应该考虑到测试旋转“a b c 5”如何?@uselpa使用模和长度:-我的解决方案实际上更短、更清晰,并且没有相同的计算陷阱。尽管如此,我还是避免发布一个实际的代码解决方案,因为我希望OP来考虑解决方案,而不是仅仅剪切和粘贴,但是我可能不得不重新考虑,以使我的答案更有可能被接受的名义。我也会认为我的解决方案更注重功能性编程:它是由非常小的、可组合的,通用功能。take、drop和append与map和fold一样,都是任何函数式编程工具包中的标准函数,尽管在这个问题中没有使用它们。与编写手动循环相比,我更愿意使用这些组件。再一次,我不想冒犯你,只是给出了我对代码质量的看法。在工作中,我们有强制性的代码评审,所以我做了很多,并且有一种我习惯的评审风格。“我很抱歉你觉得我的风格令人反感。”克里斯杰斯特·杨回答说这是一个基本的实现。OP刚刚开始学习这些东西。这个答案显示了解决问题的本地化方法,即递归,另一个则显式地创建最终结果。伟大的博览会!:
(rotate '(a b c d e) 3)
=> '(d e a b c)

(rotate '(a b c) 5)
=> '(c a b)