这两个递归函数有什么区别?

时间:2014-09-26 21:26:16

标签: recursion scheme

问题是找到数x的x ^ n的n次幂,其中n是一个正整数。下面两段代码有什么区别。它们都产生相同的结果。

这是第一个的代码:

(define (power x n)
  (define (square n) (* n n))
  (cond ((= n 1) x)
        ((even? n)
         (square (power x (/ n 2))))
        (else 
         (* (power x (- n 1)) x))))

这是第二个:

(define (power x n)
  (if (= n 1)
      x 
      (* x (power (- n 1) x))))

1 个答案:

答案 0 :(得分:3)

不同之处在于两种算法运行所需的时间。

第二个更简单但效率更低:需要O(n)次乘法来计算x^n

第一个称为 square-and-multiply 算法。本质上,它使用指数的二进制表示,并使用标识

x^(ab) = ((x^a)^b)
x^(a+b) = (x^a)(x^b)

计算结果。它只需要O(log n)次乘法来计算结果。

维基百科有一些detailed analysis of this