【问题标题】:What is the difference between these two recursive functions?这两个递归函数有什么区别?
【发布时间】:2014-11-21 23:55:15
【问题描述】:

问题是求一个数 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))))

【问题讨论】:

    标签: recursion scheme


    【解决方案1】:

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

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

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

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

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

    维基百科有一些detailed analysis of this

    【讨论】:

      猜你喜欢
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多