我对编程很新。当我构建这个程序时,我没有使用visual express出现任何错误。但是当我在没有调试的情况下运行它时,它会显示第一个cout
语句和函数调用number
的答案,然后崩溃。谁能告诉我可能出错的地方?
#include <iostream>
#include <iomanip>
using namespace std;
// This program demonstrates a recursive function.
// The function should accept two arguments, the
// number to be raised and the exponent. A function
// template is used to test different data types.
// Assume that the exponent is a nonnegative integer.
template <class T, class TT>
T number(T raised, TT exponent)
{
if (exponent == 0)
return 1;
else
return raised * number(raised, exponent -1);
}
void main()
{
// Testing integers
cout << "Testing integers: 5 raised to 2 is "
<< number(5, 2) << endl;
// Testing doubles
cout << "Testing doubles: 5.5 raised to 2.2 is "
<< setprecision(1) << number(5.5, 2.2) << endl;
// Testing floats
cout << "Testing doubles: 5.55 raised to 2.22 is "
<< setprecision(4) << number(5.55f, 2.22f) << endl;
// Testing a double and a integer
cout << "Testing integers: 5.5 raised to 2 is "
<< number(5.5, 2) << endl;
}
编辑:感谢您的回复。我现在知道了。我会调整if(exponent == 0)
答案 0 :(得分:3)
问题在于递归:
if(exponent == 0) return 1;
如果号码是double
,例如2.2
,则您未考虑的是。将其减少两倍后,它将达到.2
,然后达到-0.8
。它永远不会达到0
。当递归深度超过堆栈时,这会导致堆栈溢出。
同样void main()
是not the right way to define main。
答案 1 :(得分:0)
你打破了这个假设:
// Assume that the exponent is a nonnegative integer.
递归函数适用于整数指数,因为最终从指数中减去一个将给出零,函数将返回。
传递非整数值(例如2.2
)将导致它以1.2
,0.2
,-0.8
,-1.8
递归调用函数等等,直到堆栈爆炸。
在C ++ 11中,您可以使用例如
强制执行该假设static_assert(std::is_integral<TT>::value, "Exponent must be an integer");
虽然如果整数值太大,你仍然会遇到问题。