假设您有一个函数
的以下数字输出模式(function 0) = sqrt(6)
(function 1) = sqrt(6 + (2 * sqrt(7)))
(function 2) = sqrt(6 + (2 * sqrt(7 + (3 * sqrt(8)))))
etc...
在方案中,我有以下递归函数来计算这种模式
(define (function depth)
(cond
((= depth 0) (sqrt 6))
(else (+ (function (- depth 1)) (* (+ depth 1) (sqrt (+ depth 6)))))
)
)
我无法弄清楚如何编写else情况以便平方根被嵌套。有人可以给我一个建议吗?
答案 0 :(得分:3)
实现这个公式有点棘手,但这应该使用named let
(这只是为了避免创建另一个过程):
(define (function n)
(let helper ((a 2))
(if (= (- a 2) n)
(sqrt (+ a 4))
(sqrt (+ a 4 (* a (helper (+ a 1))))))))
如果指定的let
困扰您,这是一个完全等效的解决方案,使用嵌套的帮助程序:
(define (function n)
(define (helper a)
(if (= (- a 2) n)
(sqrt (+ a 4))
(sqrt (+ a 4 (* a (helper (+ a 1)))))))
(helper 2))
如果嵌套过程也是一个问题,那么将帮助器解压缩为一个完全独立的过程:
(define (helper a n)
(if (= (- a 2) n)
(sqrt (+ a 4))
(sqrt (+ a 4 (* a (helper (+ a 1) n))))))
(define (function n)
(helper 2 n))
无论如何,结果如预期:
(function 0)
=> 2.449489742783178
(function 1)
=> 3.360283116365224
(function 2)
=> 3.724280930782559
答案 1 :(得分:0)
以下是我将如何实现它。与@ Oscar的版本相比
代码:
(define (function n)
(if (negative? n)
(error "n is negative")
(let recur ((n n) (a 1))
(if (= -1 n)
0
(* a (sqrt (+ a 5 (recur (sub1 n) (add1 a)))))))))
测试:
> (for ((i (in-range 10))) (printf "~a ~a\n" i (function i)))
0 2.449489742783178
1 3.360283116365224
2 3.7242809307825593
3 3.8777446879222386
4 3.9447403174010236
5 3.9746786776817733
6 3.988278318778271
7 3.994530823306873
8 3.997431999017166
9 3.998787961199304
> (function -2)
n is negative