Racket 博士:保存中间结果 - Collat​​z 猜想

Dr. Racket: saving intermidiate results - Collatz Conjecture

我是编码新手,对 Dr. 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)

谁能给我一个线索或告诉我如何实现这样的东西?

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

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

然后,要构建中间值列表,您可以在每个递归步骤中使用 cons n,创建一个列表,其第一个元素是原始 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)