遞歸函數
直接或間接調用自己的函數稱爲遞歸函數。
遞歸函數的要求: 遞歸函數必須定義一個終止條件, 否則,函數將永遠遞歸下去。
#include<iostream>
using namespace std;
long fact(int i);
int main()
{
int num;
cout << "請輸入一個小於8的正整數: " << endl;
cin >> num;
long res = fact(num);
cout << num << "的階乘爲:" << res << endl;
return 0;
}
long fact(int i)
{
long temp;
if (i == 0)
{
temp = 1;
}
else
{
temp = i * fact(i - 1);
}
return temp;
}
內聯函數
內聯函數是C++爲提高程序運行速度所做的一項改進。
內聯函數的編譯代碼與其他程序代碼“ 內聯” 起來了, 也就是說, 編譯器將使用相應的函數代碼替代函數調用。
對於內聯代碼, 程序無需跳到另一個位置處執行代碼, 再跳回來。 因此, 內聯函數的運行速度比常規函數稍快, 但代價是需要佔用更多內存。
內聯函數的使用方法: 在函數聲明或函數定義前加上關鍵字inline。
通常的做法是省略原型, 將這個定義放在本應提供原型的地方。
注意: 內聯函數不能遞歸。
#include<iostream>
using namespace std;
inline int sum(int a, int b){return a + b;}
int main()
{
int res = sum(60, 25);
cout << res << endl;
return 0;
}
constexpr函數
constexpr函數: 是指能用於常量表達式的函數, 即可以在編譯時計算其返回值的函數。
常量表達式是指值不會改變並且在編譯過程就能得到計算結果的表達式。
注意:
- 函數中只能有一個return語句。
- 返回值必須是字面值類型(算術類型、 引用、 指針屬於字面值類型)。
- 參數必須是字面值類型(自定義類、 IO庫、 string類型不屬於字面值類型)。
- constexpr函數被隱式地指定爲內聯函數。
- 允許遞歸。
#include<iostream>
using namespace std;
//常量表達式函數
constexpr int fact(int n)
{
return n == 1 ? 1 : n * fact(n - 1);
}
//常量表達式
constexpr int num = 5;
int main()
{
//在編譯期間可以計算並返回結果
cout << fact(num) << endl;
cout << fact(3) << endl;
//實參爲變量時,在程序運行期間計算並返回結果
int i = 8;
int res = fact(i);
cout << res << endl;
return 0;
}