2013-07-25 53 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

当你觉得你找到了最好的答案时,一定要接受答案。 –