【问题标题】:scheme, continued-fraction, tail-recursion方案,连续分数,尾递归
【发布时间】:2021-04-23 03:13:09
【问题描述】:

作为一个方案新手,我正在尝试解决一些基本问题。
其中之一是连分数,我喜欢通过递归和尾递归两种方式来实现。
我的递归解决方案(d 和 n 是函数,k 是递归深度):

(define (c-fraction d n k)
  (if (= k 0) 1 
      (/ (n k) (+ (d k) (c-fraction d n (- k 1))))))

正在按照我的意愿工作,但我不知道如何递归地制作这个尾部。
我不知道,我必须以哪种方式积累哪个表达式。

【问题讨论】:

    标签: scheme tail-recursion continued-fractions


    【解决方案1】:

    说明你的函数计算:

    n_k / (d_k + n_{k - 1} / (d_{k - 1} + ...
    

    如果你想计算

    n_1 / (d_1 + n_2 / (d_2 + ...
    

    你需要颠倒系数的顺序:

    (define (c-fraction2 d n k)
      (c-fraction
        (lambda (x) (d (+ 1 (- k x))))
        (lambda (x) (n (+ 1 (- k x))))
        k
      )
    )
    

    对于尾递归函数,您只需要保留:

    n_k / (d_k + n_{k + 1} / (d_{k + 1} +
    

    在累加器中,无需反转系数:

    (define (c-fraction-tail d n k acc)
      (if (= k 0)
        acc
        (c-fraction-tail
          d
          n
          (- k 1)
          (/ (n k) (+ (d k) acc))
        )
      )
    )
    

    表达式(c-fraction2 d n k) 和(c-fraction-tail d n k 1) 给出相同的结果。

    【讨论】:

    • 是的,我已经看到了,有必要反转系数,但到那时我只用常数函数(fe (d 1) (n 1))测试它。 剩下的比我想象的要容易得多,我的想法很复杂。认识到使用tailrcursion时不需要反转系数是非常有启发性的。非常感谢,
      同行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2016-05-09
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多