C++ Recursion
Recursion(遞迴)
搜尋:recursion
函式呼叫自己
遞迴函式在定義中使用函數自己
Factorial
fac(n) = 1 \times 2 \times ... \times n
\begin{align*}
&fac(n) = n \times fac(n - 1) \\
&fac(0) = 1
\end{align*}
用遞回來定義
一般定義
Factorial
int fac(int n) {
if (n == 0) return 1;
return n * fac(n-1);
}Factorial

Fibonacci
\begin{align*}
&F(1) = F(2) = 1 \\
&F(n) = F(n - 1) + F(n - 2)\ for\ n > 2
\end{align*}
int f(int n) {
if(n <= 2)
return 1
return f(n - 1) + f(n - 2)
}
練習:c002. 10696 - f91
Remark
遞迴終止條件: 遞迴到某一程度要停止遞迴,否則會出現TLE 或是 segementation fault
遞迴公式:遞迴就是自己定義自己,在寫遞迴之前要先清楚知道遞迴公式的長相
練習: f640. 函數運算式求值
輾轉相除法
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x, y;
cin >> x >> y;
while(x % y && y != 0)
{
int tmp = x % y;
x = y;
y = tmp;
}
cout << y << endl;
return 0;
}
輾轉相除法
int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a % b);
}gcd(a, b) = gcd(b, a\ mod\ b)\\
gcd(a, 0) = a
a024. 最大公因數(GCD)
Tower of Hanoi
- 把所有(n個)盤子從A柱移到C柱 –
- 每次只能移動一個圓盤
- 過程中,大盤子不能疊在小盤子上面
如何移動盤子


如何移動盤子


如何移動盤子


如何移動盤子
搬N個盤子A->C,等於
1. 搬(N-1)個盤子A->B
2. 搬1個盤子A->C
3. 搬(N-1)個盤子B->C
Pseudocode
gContent
def hanoi(n,a,b,c): #n個,從1搬到3(從a到c)
if n==1:
print(f"Move ring from {a} to {c}")
else:
hanoi(n-1, a,c,b) #(n-1)個,從1搬到3(從a到b)
hanoi( 1, a,b,c) #(1)個,從1搬到3(從a到c)
hanoi(n-1, b,a,c) #(n-1)個,從1搬到3(從b到c)
hanoi(3,"A","B","C")練習: a227. 三龍杯 -> 河內之塔
#include <bits/stdc++.h>
using namespace std;
void hanoi(int n, char src, char dest, char tmp)
{
if (n == 1) {
cout << "Move 1 disk from " << src << " to " << dest << endl;
} else {
hanoi(n - 1, src, tmp, dest);//
hanoi(1, src, dest, tmp);
hanoi(n - 1, tmp, dest, src);
}
}
int main() {
hanoi(2, 'A', 'C', 'B');
return 0;
}
C++ code
練習:
- e357
C++ Recursion
By ernestii26
C++ Recursion
- 20