我有点困惑如何在方案中构建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
答案 0 :(得分:4)
让我直截了当地说,你需要items
列表中每个数字的Collatz序列的长度吗?显然这是作业,所以这次我不能给出直接答案。这是解决方案的一般结构,填写空白:
(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之一。
答案 1 :(得分:0)
我不想给出确切的答案,但你可以迭代整个列表并找到这样的长度。
(define (length lst)
(if (null? items)
'()
(+ 1 (length(cdr lst)))))
通过这种方式,您可以递归地访问列表的所有元素。它找到第一个元素添加+1
,然后它尝试查找等于cdr
的{{1}}列表的长度。它一直这样做,直到它到达列表的末尾。