Algorithm 如何在Lisp(scheme)中编写幂函数?什么';我的程序怎么了?

Algorithm 如何在Lisp(scheme)中编写幂函数?什么';我的程序怎么了?,algorithm,function,scheme,lisp,Algorithm,Function,Scheme,Lisp,下面是我的对数效率幂函数代码的两个版本。然而,第一个函数将有一个超过最大递归深度的错误,而第二个函数虽然工作,但似乎没有达到所需的效率。我是Scheme的新手,我想知道这些实现有什么问题?您的第一个版本使用自身对每个值进行平方运算,这在偶数?子句中创建了一个无限循环 您的第二个版本在每个子句中调用两次pow,以反转对数算法的任何增益 您可以使用以下方法修复它: (define (pow b n) "YOUR-DOC-HERE" (cond ((= n 0)

下面是我的对数效率幂函数代码的两个版本。然而,第一个函数将有一个超过最大递归深度的
错误,而第二个函数虽然工作,但似乎没有达到所需的效率。我是Scheme的新手,我想知道这些实现有什么问题?

您的第一个版本使用自身对每个值进行平方运算,这在
偶数?
子句中创建了一个无限循环

您的第二个版本在每个子句中调用两次
pow
,以反转对数算法的任何增益

您可以使用以下方法修复它:

(define (pow b n) 
    "YOUR-DOC-HERE"
    (cond ((= n 0) 1)
          ((even? n) (pow (pow b (/ n 2)) 2))
          ((odd? n) (* b (pow (pow b (/ (- n 1) 2)) 2)))))


(define (pow b n) 
    "YOUR-DOC-HERE"
    (cond ((= n 0) 1)
          ((even? n) (* (pow b (/ n 2)) (pow b (/ n 2))))
          ((odd? n) (* b (pow b (/ (- n 1) 2)) (pow b (/ (- n 1) 2))))))
(define (pow b n)
  "Recursive power in logarithmic depth."
  (let ((square (lambda (x) (* x x))))
    (cond ((= n 0) 1)
          ((even? n) (square (pow b (/ n 2))))
          ((odd? n) (* b (square (pow b (/ (- n 1) 2))))))))
或者像这样:

(define (pow b n) 
    "YOUR-DOC-HERE"
    (cond ((= n 0) 1)
          ((even? n) (pow (pow b (/ n 2)) 2))
          ((odd? n) (* b (pow (pow b (/ (- n 1) 2)) 2)))))


(define (pow b n) 
    "YOUR-DOC-HERE"
    (cond ((= n 0) 1)
          ((even? n) (* (pow b (/ n 2)) (pow b (/ n 2))))
          ((odd? n) (* b (pow b (/ (- n 1) 2)) (pow b (/ (- n 1) 2))))))
(define (pow b n)
  "Recursive power in logarithmic depth."
  (let ((square (lambda (x) (* x x))))
    (cond ((= n 0) 1)
          ((even? n) (square (pow b (/ n 2))))
          ((odd? n) (* b (square (pow b (/ (- n 1) 2))))))))

非常感谢你!