List 如何更改racket中列表内容的顺序?
我是一名球拍初学者,正在学习列表是如何工作的。我必须创建一个函数,该函数接受一个count变量和一个list,并生成相同的list,但第一个元素循环到list末尾“count”次数。我的代码适用于偶数列表,如调用函数2'(1 2 3 4),这将导致列表'(3 4 1 2),但不适用于奇数列表,如调用2'(1 2 3),这将导致'(3 1 2)List 如何更改racket中列表内容的顺序?,list,racket,List,Racket,我是一名球拍初学者,正在学习列表是如何工作的。我必须创建一个函数,该函数接受一个count变量和一个list,并生成相同的list,但第一个元素循环到list末尾“count”次数。我的代码适用于偶数列表,如调用函数2'(1 2 3 4),这将导致列表'(3 4 1 2),但不适用于奇数列表,如调用2'(1 2 3),这将导致'(3 1 2) 我错过了什么 您应该是右转-ing(length aList)-count元素,而不是count此问题的递归解决方案应使用基本情况,即count为零时:在
我错过了什么 您应该是
右转-ing(length aList)-count
元素,而不是count
此问题的递归解决方案应使用基本情况,即count
为零时:在这种情况下,不需要进行旋转,输入列表应按原样返回
否则,应执行一次旋转,并减少计数
使用递归的思想是将问题分解为子问题。必须至少有一个基本情况导致立即返回某个结果,并且必须有一个递归步骤来减少问题。在这种情况下,将减少计数
,直到达到基本情况。在每个递归步骤中,列表的第一个元素被追加到列表其余部分的末尾,并且计数减少1,直到达到基本情况。当到达这里的基本情况时,除了返回结果外,无需执行任何操作
还请注意,当计数
大于输入列表的长度时,周期-n
的以下定义有效(长度为4的列表的(周期-n 5列表)
的结果应与(周期-n 1 a-list)
的结果相同)。在这种情况下,cycleN
的定义,即使是“正确”的形式,也不适用
(define (cycle-n count a-list)
(cond
[(zero? count) a-list]
[else
(cycle-n (- count 1)
(append (rest a-list) (list (first a-list))))]))
示例REPL交互:
scratch.rkt>(循环n 1'(1 2 3 4))
'(2 3 4 1)
划痕.rkt>(循环n 2'(1 2 3 4))
'(3 4 1 2)
划痕.rkt>(循环3’(1 2 3 4))
'(4 1 2 3)
划痕.rkt>(循环4’(1 2 3 4))
'(1 2 3 4)
划痕.rkt>(循环n 5’(1 2 3 4))
'(2 3 4 1)
您是否应该为这个问题提出递归解决方案?代码看起来像是要递归的,但事实并非如此。我应该想出一个递归的解决方案。你能解释一下它是如何不递归的吗?递归函数调用自己;发布的代码不调用自身。
(define (cycle-n count a-list)
(cond
[(zero? count) a-list]
[else
(cycle-n (- count 1)
(append (rest a-list) (list (first a-list))))]))