【发布时间】:2011-04-25 14:52:24
【问题描述】:
对于班级我有一个作业:
编写一个 C++ 程序,该程序将输出您可以从一组
n对象中选择k对象的不同方式的数量(n和k都应该是正整数)。这个数字由以下公式给出:
C(n, k) = n!/(k! * (n - k)!)您的程序应该使用两个返回值的函数。第一个应称为
factorial并应返回n!。第二个函数应该被称为combinations并且应该返回n!/(k! * (n - k)!).测试你的程序五次n和k的不同值(计数控制循环)。
我想出了一个解决方案:
#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' : 在所有控制路径上递归,函数会导致运行时栈溢出;"
如果有人可以帮助我,我已经为此工作了大约一个小时,我被难住了!
【问题讨论】:
-
现在对于所有已经通过递归实现阶乘的人来说,这是一个简单的代表;)
-
至少在 Visual Studio 上,默认情况下只是警告,而不是错误。您可以随意忽略它并编译它,尽管该函数会导致运行时堆栈溢出。这是非常相关的;如果您试图理解这样的警告,在递归函数中设置断点并单步执行程序可能会很有指导意义。
-
问题标题真的很糟糕。这个问题与输出数字关系不大,HELP 很烦人,有点冒犯。我们知道您需要帮助,“帮助!”让你看起来像是对它有某种道德主张(就好像你溺水或其他什么一样)。
-
大声笑,我会记住这一点,大卫。这对我来说是全新的,什么是合适的名字?
-
@Stephenson024:类似于“递归问题”或“递归警告消息”。您遇到的问题是递归,而不是输出。
标签: c++ recursion stack-overflow compiler-warnings factorial