for scheme in scheme

时间:2013-02-14 20:02:51

标签: loops lisp scheme racket collatz

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

2 个答案:

答案 0 :(得分: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中提供的内置looping constructs之一。

答案 1 :(得分:0)

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

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

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