Racket 博士:保存中间结果 - Collatz 猜想
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)
我是编码新手,对 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)