2016-07-18 47 views
2

我有兩個問題,C中的尾遞歸?

  1. 能一尾遞歸函數比2點的參數嗎?

  2. 以下實現在指數函數中,其基數爲 提高到其功率,有沒有其他方法可以進一步改進 下面的函數?

這是我的代碼:

#include <stdio.h> 

int power(int m,int n, int o); 
int powerAux(int m, int n);  
main() { 
    printf("%d\n", powerAux(2,3)); 
} 
int power(int m, int n, int o) { 
    if (o == 1) { 
     return m; 
    } 
    return power(m*n, n, o - 1); 
} 
int powerAux(int m, int n) { 
    return power(m, m, n); 
} 
+1

我將輸出一個錯誤的值,因爲當我們通過在(2,3) 的功能將是 (2 * 2,2) (4 * 4,1) ,其是16,正確答案是8. – naveenath

回答

1

你絕對可以通過實現快速乘法算法提高你的函數的效率:

int exp(int base, int pow) { 
    if (pow == 0) { 
     return 1; 
    } 
    if (pow%2 == 0) { 
     int temp = exp(base, pow/2); 
     return temp*temp; 
    } else { 
     int temp = exp(base, (pow-1)/2); 
     return temp*temp*base; 
    } 
} 

我們使用溫度值不與遞歸兩次計值相同。

+1

該解決方案導致無限循環 – naveenath

+0

添加了被遺忘的quit語句。謝謝! – xenteros

+0

爲什麼這比以前的解決方案更快,我們正在進行除法和額外模數檢查,但原始解決方案只能乘法找到答案? – naveenath

3
  1. 當然,爲什麼不?您的函數不處理指數0。你的基本情況應改爲:

    if (o == 0) { 
        return m; 
    } 
    

    和你累加器初始化爲1

    return power(1, m, n); 
    

    此外,n/o也許應該改爲unsigned,因爲你的代碼不處理負指數(並且它不能不改變爲非整數類型)。