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

时间:2017-10-09 13:44:34

标签: collatz dr.racket

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

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

1 个答案:

答案 0 :(得分:1)

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

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

然后,要构建中间值列表,您可以在每个递归步骤中使用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)