【问题标题】:How to change the order of the contents of a list in racket?如何更改球拍中列表内容的顺序?
【发布时间】:2020-06-07 10:00:05
【问题描述】:

我是球拍初学者,正在学习列表的工作原理。我必须创建一个函数,该函数接受一个计数变量和一个列表并生成相同的列表,但第一个元素循环到列表“count”次数的末尾。我的代码适用于偶数列表,例如调用函数 2 '(1 2 3 4),这会导致列表 '(3 4 1 2),但不适用于奇数列表,例如调用 2 '(1 2 3),这应该导致'(3 1 2)

(define (cycleN count aList)
  (cond
    [(empty? aList) '()]
    [(= count 0) aList]
    [(= count (length aList)) aList]
    [else (append (take-right aList count) (take aList count))]))

我错过了什么?

【问题讨论】:

  • 你应该想出一个递归解决这个问题吗?代码看起来想要递归,但实际上不是。
  • 我应该想出一个递归解决方案。你能解释一下它是如何不递归的吗?
  • 递归函数调用自身;发布的代码不会调用自己。

标签: list racket


【解决方案1】:

你应该是take-right-ing (length aList) - count 元素,而不是count

【讨论】:

    【解决方案2】:

    此问题的递归解决方案应使用基本情况,即count 为零:在这种情况下,无需进行轮换,输入列表应按原样返回。

    否则,应旋转一圈,并减少count

    使用递归的想法是将问题分解为子问题。必须至少有一个基本情况会导致某些结果立即返回,并且必须有一个递归步骤来减少问题。在这种情况下,count 会减少,直到达到基本情况。在每个递归步骤中,列表的第一个元素被附加到列表其余部分的末尾,并且计数减一直到达到基本情况。当这里达到基本情况时,除了返回结果外,没有什么可做的。

    还请注意,当count 大于输入列表的长度时,cycle-n 的以下定义有效(对于长度为 4 的列表,(cycle-n 5 alist) 的结果应该与 (cycle-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> (cycle-n 1 '(1 2 3 4))
    '(2 3 4 1)
    scratch.rkt> (cycle-n 2 '(1 2 3 4))
    '(3 4 1 2)
    scratch.rkt> (cycle-n 3 '(1 2 3 4))
    '(4 1 2 3)
    scratch.rkt> (cycle-n 4 '(1 2 3 4))
    '(1 2 3 4)
    scratch.rkt> (cycle-n 5 '(1 2 3 4))
    '(2 3 4 1)
    

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2012-09-25
      相关资源
      最近更新 更多