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

Recursion 这两个递归函数之间有什么区别?,recursion,scheme,Recursion,Scheme,问题是求一个数x的x^n的n次方,其中ni是一个正整数。下面两段代码之间的区别是什么。它们都产生相同的结果 这是第一个的代码: (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)))) 这是第二个: (

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

这是第一个的代码:

(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))))

区别在于两种算法运行所需的时间

第二种方法更简单,但效率也更低:它需要
O(n)
乘法来计算
x^n

第一种称为平方乘算法。本质上,它使用指数的二进制表示,并使用恒等式

x^(ab) = ((x^a)^b)
x^(a+b) = (x^a)(x^b)
计算结果。它只需要
O(logn)
乘法即可计算结果

维基百科有一些