递归函数不返回指定值
Posted
技术标签:
【中文标题】递归函数不返回指定值【英文标题】:Recursive function does not return specified value 【发布时间】:2014-12-29 15:24:32 【问题描述】:我正在尝试调试用于验证用户输入并在输入正常时返回值的递归函数。函数如下所示:
double load_price()
double price;
Goods * tempGd = new Goods();
cin >> price;
while (!cin)
cin.clear();
#undef max
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cout << endl;
cout << "You didn't enter a number. Do so, please: ";
cin >> price;
// endwhile
if (!tempGd->set_price(price))
cout << endl;
cout << "The price " << red << "must not" << white << " be negative." << endl;
cout << "Please, insert a new price: ";
load_price();
else
delete tempGd;
return price;
Goods类的方法set_price()如下所示
bool Goods::set_price(double price)
if (price> 0)
priceSingle_ = price;
priceTotal_ = price* amount_;
return true;
return false;
我尝试在纸上画出问题,但我的所有图表看起来都像我的函数已经看起来的样子。我觉得退货有些问题,但不知道在哪里。
我们将不胜感激。
【问题讨论】:
你认为load_price();
的递归结果会去哪里?
不要,我重复不要,在这里使用指针和new
。这是完全没有意义的,它实际上会在你的代码中引入内存泄漏。
@WhozCraig 我真的不知道。它似乎被埋在函数本身的某个地方。
@KonradRudolph 感谢您的提示,m8,将堆上的货物对象替换为堆栈对象。
@WhozCraig:正确答案是:nowhere。
【参考方案1】:
您没有使用递归调用的返回值。你需要做的:
return load_price();
【讨论】:
请问我的退货价格;用上述代码替换,Barmar? @OndřejŠimon 不,你所有的递归调用都应该被替换。 @CaptainGiraffe 哦,我明白了,将递归调用 load_price() 替换为 return load_price();正如 Barmar 建议的那样。谢谢你们。【参考方案2】:谁说服你使用递归来解决这个问题?
#undef max
double load_price()
for(;;)
double price;
cin >> price;
if (!cin)
cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cout << endl;
cout << "You didn't enter a number. Do so, please: ";
continue;
if (!Goods().set_price(price))
cout << endl;
cout << "The price " << red << "must not" << white << " be negative." << endl;
cout << "Please, insert a new price: ";
continue;
return price;
【讨论】:
感谢您的迭代解决方案。老实说,我试图找到一个,但无法理解它。我会用你的,如果你不介意的话。我不太喜欢递归,只是想不出迭代解决方案。 当然,随意使用。如果我不希望人们使用它,我不会在这里发布任何内容。 再次感谢您,汉斯。我使用您的模板更改了我的其他 2 个递归方法,这些方法用于检查插入的 ID 和商品数量。以上是关于递归函数不返回指定值的主要内容,如果未能解决你的问题,请参考以下文章
尾递归 递归函数中,递归调用是整个函数体中最后的语句,且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归,空间复杂度是O