2013-07-25 55 views
2

我有一個家庭作業問題,要求寫一個迭代和遞歸組合函數。將它們放置在給定的程序中,以查看哪些花費更長時間C++迭代組合函數不工作

我遇到了迭代函數的問題。我已經多次閱讀並且不斷收到一個mach-o-linker錯誤。我嘗試過很多不同的方式來識別我的變數,但仍然沒有找到任何運氣。

對此主題的任何幫助將不勝感激。我認爲迭代器函數或階乘函數存在問題,但我現在無法在我的生活中看到它。

再次感謝提前

#include <iostream> 
#include <sys/time.h> 
#include <cstdlib> 
using std::cout; 
using std::endl; 

double iR; 
double iN; 

typedef unsigned int uint; 

uint Factorial(uint n) 
    { 
    if (n == 0) return 1; 
    if (n <= 2) return n; 
    else return n * Factorial(n - 1); 
    } 

    double combination_recursive(double iN, double iR); 
    double combination_iterative(int iN, int iR); 



    int main(int argc, const char * argv[]) { 


typedef struct timeval time; 
time stop, start; 
gettimeofday(&start, NULL); 

iN = 20.0; 
iR = 3.0; 


    combination_iterative(iN, iR); 


gettimeofday(&stop, NULL); 
if(stop.tv_sec > start.tv_sec) 
    cout << "Seconds: " << stop.tv_sec-start.tv_sec << endl; 
    else 
    cout << "Micro: " << stop.tv_usec-start.tv_usec << endl; 
    return 0; 
} 

double comination_iterative(int, int) { 

    if (iN == iR) { return 1;} 
    if (iR == 0 && iN!= 0) { return 1;} 
    else return (iN * Factorial(iN-1))/Factorial(iN-1)*Factorial(iN-iR); 

} 

double combination_recursive(double iN, double iR) { 
    if (iR < 0 || iR > iN) { 
     return 0; 
} 
    if (iR < 1) { 
    return 1; 
} 
    if (iN == iR) { 
    return 1; 
} 
return combination_recursive(iN - 1, iR) + combination_recursive(iN - 1, iR - 1); 
} 
+0

歡迎使用stackoverflow。你能把你的例子減少到最低限度嗎?它會改善問題並增加你得到有意義答案的機會。 –

+1

可否請您將您的錯誤從您的錯誤控制檯copypasted? – nio

+1

注意:全局變量'iN'和'iR'與'combination_recursive'的定義中的函數參數'iN'和'iR'不同。 comination_iterative的定義完全忽略了它的參數,並使用全局的'iN'和'iR'。 – aschepler

回答

2

,我認爲你的錯誤是由於拼寫錯誤簡單。

您在主

combination_iterative(iN, iR); 

這個函數的調用,但你把它定義爲

double comination_iterative(int, int) { 

if (iN == iR) { return 1;} 
if (iR == 0 && iN!= 0) { return 1;} 
    else return (iN * Factorial(iN-1))/Factorial(iN-1)*Factorial(iN-iR); 
} 

爲了解決這個問題只需要改變函數的定義相匹配的呼叫

double combination_iterative(int, int) { 

if (iN == iR) { return 1;} 
if (iR == 0 && iN!= 0) { return 1;} 
    else return (iN * Factorial(iN-1))/Factorial(iN-1)*Factorial(iN-iR); 
} 

快樂編碼和學習C++

0
  1. 您的函數的名稱拼寫錯誤:

    ​​

    應該

    double combination_iterative(int, int) 
    
  2. 你缺少main函數之前其前進的定義:

    double cobmination_iterative(int, int); 
    

    修復此代碼後編譯。

  3. 接下來測量任何合理的時間,你應該在一個'平面循環'中多次調用你的測試函數...例如在一次迭代中8次。這樣,你會避免的時候引入的誤差只花了循環:

    int i; 
        for(i=0;i<1000;i++) 
        { 
        combination_iterative(iN, iR); 
        combination_iterative(iN, iR); 
        combination_iterative(iN, iR); 
        //... 
        } 
    

    您應該循環迭代的數量進行試驗。 Here is a question更多與基準測試有關。

+0

謝謝nio和保羅。缺失的定義來自簡單地嘗試不同的方式來傳遞我的論點。但我錯過了拼寫錯誤。我感到非常愚蠢。我必須要戴眼鏡...... – jamcoder

+0

當你覺得你找到了最好的答案時,一定要接受答案。 –