嵌套平方根递归

用户名

假设您具有以下函数的数字输出模式

(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案例,以便平方根被嵌套。有人可以给我一个建议吗?

奥斯卡·洛佩兹(Oscar Lopez)

该公式的实现有点棘手,但是应该使用namedlet来工作(这只是为了避免创建另一个过程):

(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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章