我写了一个函数来计算1/22的值如下:(我知道该方案已经可以计算1/22的值作为计算器了)
(define (one-over-twenty-two n)
(if (<= n 1)
0
(if (= 0 (modulo n 2))
(+ (* (/ 1 (expt 10 n)) 4.0) (one-over-twenty-two (- n 1)))
(+ (* (/ 1 (expt 10 n)) 5) (one-over-twenty-two (- n 1))))))
此功能按预期工作。但是,我想使用辅助函数编写这个函数,我被卡住了。我的代码如下:
(define (one-over-22 n)
(define (one-over-22-h next k)
(cond ((= k n) 0)
((<= k 1) 0)
((= 4 next)(* (/ 1 (expt 10 n)) 4.0)(+ k 1) (+ next 1))
((= 5 next)(* (/ 1 (expt 10 n)) 5.0)(+ k 1) (- next 1))))
(one-over-22-h 4 0) (one-over-22 (- n 1)))
我相信我最终会得到无限递归,但我无法分辨。另外,我应该在我的辅助函数中进行求和,还是应该在main函数的主体中进行求和?
答案 0 :(得分:3)
该功能的第二版有几个问题:
k
,n
不应出现在代码中one-over-22
函数,这里的想法是帮助程序负责迭代,而one-over-22
只是通过了适当的助手初始值next
的初始值取决于n
是偶数还是奇数,并不总是4
这应解决发现的问题,与您的代码进行比较,以查看错误的位置:
(define (one-over-22 n)
(define (one-over-22-h next k)
(cond ((<= k 1) 0)
((= next 4)
(+ (* (/ 1 (expt 10 k)) next)
(one-over-22-h (+ next 1) (- k 1))))
((= next 5)
(+ (* (/ 1 (expt 10 k)) next)
(one-over-22-h (- next 1) (- k 1))))))
(one-over-22-h (if (even? n) 4.0 5.0) n))