1

我有点困惑如何在方案中构造一个 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
4

2 回答 2

4

让我直截了当地说,您需要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 中可用的内置循环结构之一了。

于 2013-02-14T20:28:04.633 回答
0

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

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

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

于 2014-10-28T09:51:15.973 回答