-1

我是编码新手,对 Racket 博士很感兴趣,现在我面临第一个问题。我创建了这段代码:

(define (collatz n)
  (cond ((= n 1) 1)
        ((> n 1) (collatz_helper n))))

(define (collatz_helper n)
  (if (even? n)
      (collatz (/ n 2))
        (collatz (+ (* 3 n) 1))))


(collatz 100)    ;; >1

是否可以将所有中间结果存储在列表或其他内容中,然后打印出来。我的意思是中间结果 n/2 或 3n+1 直到我们得到 1。

例如 n=100 (100, 50, 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1)

有人可以给我一个线索或告诉我如何实现这样的事情吗?

4

1 回答 1

1

首先,您可以将两个函数合并为一个,cond用于检查所有三种情况:

(define (collatz n)
  (cond
    ((= n 1) 1)
    ((even? n)
     (collatz (/ n 2)))
    (else
     (collatz (+ (* 3 n) 1)))))

然后,要构建中间值列表,您可以n对每个递归步骤进行 cons,创建一个列表,其第一个元素是原始 n,最后一个元素是 1(假设它终止):

(define (collatz n)
  (cond
    ((= n 1) '(1))
    ((even? n)
     (cons n (collatz (/ n 2))))
    (else
     (cons n (collatz (+ (* 3 n) 1))))))

例如,

(collatz 100)
=> '(100 50 25 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1)
于 2017-10-10T01:23:31.390 回答