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

 

遞迴公式:遞迴就是自己定義自己,在寫遞迴之前要先清楚知道遞迴公式的長相

輾轉相除法

#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

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")
#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

練習:

  1. e357

C++ Recursion

By ernestii26