我是编码新手,对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)
有人能给我一些线索或告诉我如何实现这样的事情吗?
答案 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)