【问题标题】:for loop in scheme方案中的 for 循环
【发布时间】:2013-02-14 20:02:51
【问题描述】:

我有点困惑如何在方案中构造一个 for 循环。 for 循环应该在第二部分中实现。它需要一个数字列表并将每个元素插入到第一部分的列表中以查找长度。我用电缆来获取第一个元素,但我需要一个 for 循环或其他什么来获得这样的输出:'(7 10 5 16 106 37) 这是我的代码:

#lang racket
; Part I
(define (sequence n)
(cond  [(= n 1)
      (list n)]
[(even? n)
( cons n(sequence( / n 2)))]
[(odd? n) 
( cons n(sequence (+(* n 3) 1))) ] ))

(sequence 3)

; Part II
(define (find-length items)
( cond [(null? items)
      (list items)]
  [find-length(length(sequence(car items))) ]   
  ))

  (find-length '(10 13 16 22 95 158))

这是输出:

 '(3 10 5 16 8 4 2 1)
 7

【问题讨论】:

  • 输出似乎与输入不匹配。您对此输入的期望结果是什么? : (find-length '(10 13 16 22 95 158))
  • 输出应该是:'(7 10 5 16 106 37),我只得到第一个元素是7

标签: loops lisp scheme racket collatz


【解决方案1】:

让我直截了当地说,您需要 items 列表中每个数字的 Collat​​z 序列的长度吗?显然这是作业,所以这次我不能直接回答。这是解决方案的一般结构,请填空:

(define (find-length items)
  (if (null? items)           ; if the list is null
      <???>                   ; return the empty list
      (cons                   ; otherwise `cons` the
       (length <???>)         ; length of Collatz sequence of first element
       (find-length <???>)))) ; and recur over the rest of the list

测试程序,结果应该如下图:

(find-length '(10 13 16 22 95 158))
=> '(7 10 5 16 106 37)

请注意,您的答案几乎是正确的 - 此过程的基本情况只是空列表,您忘记调用递归。在 Scheme 中,至少要知道,尽量不要考虑 while、for 循环:根据递归实现迭代,这是惯用的做法。弄清楚之后,您就可以开始使用 Racket 中的内置 looping constructs 之一了。

【讨论】:

  • 谢谢你,但你能解释一下我如何在列表的其余部分重复,我使用 cdr 但它返回一个列表到第一部分,只接受数字
  • @user2070173 你在正确的轨道上:使用cdr 请注意,在最后一行中,你没有调用sequence 过程——你调用的是find-length,它接收到一个list 作为参数 - 所以 cdr 返回正确的值!
  • 你真的应该看看“How to Design Programs”或“The Little Schemer”,这两本书都会教你如何正确思考Scheme中问题的解决方案。跨度>
【解决方案2】:

我不想给出确切的答案,但你可以迭代整个列表并像这样找到这个长度。

(define (length lst)
(if (null? items)
'()
(+ 1  (length(cdr lst)))))

通过这种方式,您可以递归地访问列表的所有元素。它发现第一个元素添加了+1,然后它尝试找到等于length lst-1cdr 列表的长度。它会一直这样做,直到到达列表的末尾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2020-11-14
    相关资源
    最近更新 更多