方案一 - 二十二个功能

时间:2013-09-26 14:14:53

标签: scheme helper

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

我相信我最终会得到无限递归,但我无法分辨。另外,我应该在我的辅助函数中进行求和,还是应该在main函数的主体中进行求和?

1 个答案:

答案 0 :(得分: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))