0

我编写了一个函数来计算 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)))

我相信我在这里以无限递归结束,但我不知道。另外,我应该在我的辅助函数中求和,还是应该在主函数的主体中进行求和?

4

1 回答 1

3

第二版函数存在几个问题:

  • 辅助函数中的迭代变量是kn不应出现在代码中
  • 条件与原始函数中的不同
  • 您错误地调用了辅助函数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))
于 2013-09-26T14:38:54.743 回答