嵌套的平方根递归

时间:2014-09-15 03:05:36

标签: recursion scheme

假设您有一个函数

的以下数字输出模式
(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情况以便平方根被嵌套。有人可以给我一个建议吗?

2 个答案:

答案 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的版本相比

  1. 它涵盖n的错误输入值(Oscar的解决方案将无限期地循环用于负值)
  2. 没有多余的表达
  3. 代码:

    (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