在scheme中将列表向右旋转

在scheme中将列表向右旋转,scheme,Scheme,如果这是将列表向左旋转: (define (rotate-left l) (if (null? l) '() (append (cdr l) (cons(car l) '())))) 如何将列表向右旋转?如果您可以编写一个帮助函数来查找最后一个元素,那么执行递归实现非常简单: (define rotate-right (lambda (lis full) (if (null? (cdr lis)) (cons (car lis) (get-a

如果这是将列表向左旋转:

(define (rotate-left l)
  (if (null? l)
      '()
      (append (cdr l) (cons(car l) '()))))

如何将列表向右旋转?

如果您可以编写一个帮助函数来查找最后一个元素,那么执行递归实现非常简单:

(define rotate-right
  (lambda (lis full)
    (if (null? (cdr lis))
      (cons (car lis) (get-all-but-last full))
      (rotate-right (cdr lis) full))))

(define get-all-but-last
  (lambda (lis)
    (if (null? (cdr lis))
      '()
      (cons (car lis) (get-all-but-last (cdr lis))))))

下面是一个简短的非递归解决方案:

(define (rotate-right l)
  (let ((rev (reverse l)))
    (cons (car rev) (reverse (cdr rev)))))
(define (rotate-right l)
  (let iter ((remain l)
             (output '()))
    (if (null? (cdr remain))
        (cons (car remain) (reverse output))
        (iter (cdr remain) (cons (car remain) output)))))
这是一个迭代的解决方案:

(define (rotate-right l)
  (let ((rev (reverse l)))
    (cons (car rev) (reverse (cdr rev)))))
(define (rotate-right l)
  (let iter ((remain l)
             (output '()))
    (if (null? (cdr remain))
        (cons (car remain) (reverse output))
        (iter (cdr remain) (cons (car remain) output)))))


如果向左旋转将第一个元素移动到最后一个位置,那么相反的元素会做什么?在执行<代码>向右旋转时,您到底在哪里遇到问题?除了说明您试图解决的问题外,您还需要描述/包括您尝试过的内容(希望有一些代码),这样您遇到的问题就可以更加清楚。检索最后一个元素时出现问题吗?还是在你有了最后一个元素后就开始构建最终的列表?或者别的什么…?(定义(向右旋转l)(如果(null?l)’()(追加(cdr(cdr l))(cons(car l)’(аа)’)我不知道如何将最后一个术语移到fronExamine左旋转列表的相反方向的结果。这里是对称的。
(定义(将最后一个列表移到前面的最后一个列表,不带最后一个)(将最后一个列表移到前面的最后一个列表,不带最后一个))
。你可以做到——只要你采取足够小的、可管理的步骤。你知道什么是缺点,对吧?