這是一個很沒有效率的方法。請寫一個更有效率的程式,
並且分析您的程式中一共用了多少個乘法。
你應該以少於n-1個乘法做為設計準則。
解:
對於遞迴關係而言,最重要的就是分析n的值的狀況,
然後做出相對應的動作,且要有終止的條件。
就此例而言,我們可以將n每次分成2份,
如果n是偶數的話就可以變成(m^(n/2))*(m^(n/2)),
奇數的話則會多出一個m,
最後分到沒得分(0)的時候就傳回m^0=1。
如此一來遞迴做到最後我們只需要負擔最多2*log n次的乘法(底數為2),
最少則是log n次。(在前面每次拆分都是偶數的情況下。)
Code:
#include <stdio.h> #include <stdlib.h> unsigned long recursive_power(unsigned long m, unsigned long n) { unsigned long temp; if(n == 0) // m ^ 0 = 1 return 1; else if ( n & 0x01UL == 0) // even { temp = recursive_power(m, n >> 1); // m, n/2 return temp * temp; } else // odd return m * recursive_power(m, n-1); } int main(int argc, char *argv[]) { unsigned long m, n; m = 5; n = 11; printf("\n%ld^%ld = %ld\n",m , n, recursive_power(m,n)); system("PAUSE"); return 0; }
沒有留言:
張貼留言