[英]C++ recursion does not return expected value
這是我的代碼。 我希望它返回5,因為增量為1。 問題是,如果x> = 5,那么如何將值返回主函數? 函數中只能有1個返回值。
int addup(int x)
{
if (x < 5)
{
std::cout<< x++;
addup(x);
}
else return x;
}
int main()
{
using namespace std;
int x = 0;
cout << "And x is:" << addup(x) << endl;
cin.clear();
cin.ignore(32767, '\n');
cin.get();
return 0;
}
您錯過了遞歸調用的return
。
更換
addup(x);
通過
return addup(x);
如果沒有該行的return
,該函數的確會在最后消失,並受到不確定的行為的影響。
一個好的編譯器會警告您if
塊中缺少return
語句。 使用-Wall
編譯時,我從g ++收到以下警告:
socc.cc: In function ‘int addup(int)’:
socc.cc:11:1: warning: control reaches end of non-void function [-Wreturn-type]
}
您應該在遞歸期間始終返回一個值:
int addup(int x)
{
if (x < 5)
{
std::cout << x++;
return addup(x);
}
else return x;
}
在某些語言中(例如Java),您的原始代碼將導致編譯器錯誤,因為它並不總是返回值。 在您的C ++編譯器中,顯然允許這樣做,盡管您的if-else
兩個流程都應返回一個值,這是一種很好的做法。
好吧,要了解遞歸返回的原因,您可以考慮函數調用/堆棧框架的基礎知識:
我們需要return語句將值傳遞回當前函數的調用框架的直接調用者。 在遞歸的情況下,此直接調用方可以是同一功能的另一次調用。
如果未使用您調用的函數的返回值(遞歸或常規),則該返回值將被丟棄,或者在許多語言中都是錯誤的。 在某些情況下,最后一個函數調用的返回值會自動重新用作當前函數調用的返回值。 這就是為什么您可能會看到未定義的行為並阻止某些智能編譯器對此發出警告的原因。
遞歸調用應具有:
基本情況:我們可以解決的一些情況和返回值。 可能有多個基本案例。
接近我們基本情況的算法或邏輯(即將原始問題分解為更簡單的問題)。
遞歸調用將較簡單的問題傳遞回函數中。
因此,在這種情況下,您的基本情況是(x> = 5),更接近基本情況的邏輯是(x ++),並且遞歸調用是帶有參數x的加法。 但是您不能在此處保存返回值,否則返回值可能會被丟棄或丟失,從而可能導致進一步的問題,因此應將其正確處理為:return addup(x);
我希望現在有道理。
您忘了添加return
,僅此而已:
...
if (x < 5)
{
std::cout<< x++;
return addup(x);
// ^^^^^^
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.