实现阶乘函数时,“在所有控制路径上递归”错误

时间:2010-10-14 19:56:39

标签: c++ recursion stack-overflow compiler-warnings factorial

上课时我有一个作业:

  

编写一个C ++程序,该程序将输出一些不同的方法,您可以从一组k个对象(nn中挑选k个对象应该是正整数)。该数字由以下公式给出:

     

C(n, k) = n!/(k! * (n - k)!)

     

您的程序应使用两个返回值的函数。第一个应该被称为factorial并且应该返回n!。第二个函数应该被称为combinations并且应该返回n!/(k! * (n - k)!).测试您的程序以获取nk五次的不同值(计数控制循环)。

我想出了一个解决方案:

#include <iostream>
using namespace std;
int factorial(int);
int combination(int, int);

void main(void)
{
    int objects, set_number, count; 
    count = 1; 
        while(count <= 5)
        {
            cout << "Please enter in number of objects ";
            cin >> objects; 
            cout << "Please enter in the number of Sets ";
            cin >> set_number;
            count++;
        }

    cout << "The Factorial is " << factorial(set_number) << " & the combination is " << combination << endl;
    cout << endl; 
}

// Factorial 
int factorial(int set_number)
{
    int cal;
    cal = set_number * factorial(set_number - 1);
    return cal; 
}

//  Combination
int combination(int objects, int set_number)
{
    int com_total, cal_set, cal_obj, min_sum, cal_min;

    cal_set = set_number * factorial(set_number - 1);
    cal_obj = objects * factorial(objects - 1);

    //n!/(k! * (n - k)!)
    min_sum = set_number - objects; 
    cal_min = min_sum * factorial(min_sum- 1);
    com_total = cal_set / (cal_obj * cal_min);
    return com_total; 
}

......但是我一直收到错误,那就是说;

  

“'factorial':在所有控制路径上递归,函数将导致运行时堆栈溢出;”

如果有人可以帮助我,我已经在这上工作了大约一个小时,我很难过!

6 个答案:

答案 0 :(得分:16)

递归函数定义有两个关键元素:

  • 对自身的递归调用
  • 终止条件

您似乎错过了终止条件。 factorial()如何永远退出自己?

答案 1 :(得分:2)

您定义了一个递归函数(即基本上是一个调用自身的函数),但您还没有定义退出条件。您在返回之前再次调用factorial,因此该函数将永远不会结束,一遍又一遍地调用自己。

你需要在那里添加一个分支,即

if (set_number == 0)
{
   return 1;
}
else
   return set_number * factorial(set_number - 1);

答案 2 :(得分:1)

您缺少一个基本案例。因子应该为set_number&lt; = 1

返回1

答案 3 :(得分:0)

此函数将导致不定式递归,因为它永远不会停止调用自身:

int factorial(int set_number)
{
    int cal;
    cal = set_number * factorial(set_number - 1);
    return cal; 
}

这就是你想要的:

int factorial(int n)
 {
  if (n<=1)
    return(1);
  else
    n=n*factorial(n-1);
    return(n);
 }

答案 4 :(得分:0)

你的阶乘函数不会在一个函数上终止,它只是无限地递归。

int factorial(int set_number)
{
    if (set_number <= 1)
        return 1;
    return set_number * factorial(set_number - 1);
}

你的编码风格也很差,它看起来很像C。在main之后不需要定义阶乘和组合,并且您在顶部声明所有变量,没有声明和初始化混合?

此外,您的主要功能实际上并没有按照规范所说的那样做 - 您从未初始化或分配给组合变量,也没有调用组合函数,您的变量非常命名等等。但这是您的功课,而不是矿。

答案 5 :(得分:0)

int factorial(int set_number)
{   
   return set_number == 1?1:set_number * factorial(set_number - 1);
}