Arvin Liu @ Sprout
就是一個函數呼叫自己!
int f(int x){
if (x == 1) return 1;
return x + f(x-1);
}
int f(int x){
if (x == 1) return 1;
return x + f(x-1);
}
(Fibonacci number)
int fib(int x){
if ( x==1 || x==2 ) return 1;
return fib(x-1) + fib(x-2);
}
int fib(int x){
if ( x==1 || x==2 ) return 1;
return fib(x-1) + fib(x-2);}
5
f(20) = 1352,你可以自己驗證看看。
f(20) = 1352,你可以自己驗證看看。
int f(int n){
if(n<=3) return 1;
if(n%3==0) return f(n-1)+f(n-2);
return f(n-1)+f(n-3);
}
是不是求不出來呢?
int mem[10000]={0}; // 初始化成0。
int fib(int x){
if(n == 1 || n == 2) return 0;
if(mem[x]) // mem[x] = 0 表示沒存過。
return mem[x];
else
return mem[x] = fib(x-1) + fib(x-2);
}
int mem[10000]={0}; // 初始化成0。
int f(int n){
if(n<=3) return 1;
if(mem[n]) return mem[n];
if(n%3==0) return mem[n] = f(n-1)+f(n-2);
return mem[n] = f(n-1)+f(n-3);
}
DP : Dynamic Programming 動態規劃
DP的其中一個實作方法就是遞迴 + 記憶化
C(n,m) =
C(n-1,m-1)+
C(n-1,m)
#include <iostream>
using namespace std;
int C(int n,int m){
if(m==1 || n==m) return 1;
else return C(n-1,m-1)+C(n-1,m);
}
int main(){
int T;
cin >> T;
while(T--){
int n,m;
cin >> n >> m;
cout << C(n,m) << endl;
}
}
#include <iostream>
using namespace std;
int mem[100][100]={0};
int C(int n,int m){
if(m==1 || n==m) return 1;
else if(mem[n][m]) return mem[n][m];
else return mem[n][m] = C(n-1,m-1)+C(n-1,m);
}
int main(){
int T;
cin >> T;
while(T--){
int n,m;
cin >> n >> m;
cout << C(n,m) << endl;
}
}
如果 a>b
則 a 會變成 a%b,
並算GCD(a%b,b)
如果 a>b
則 a 會變成 a%b,並算GCD(a%b,b)
換句話說:
如果 a>b
GCD(a,b) = GCD(a%b , b)
如果 a>b,
GCD(a,b) = GCD(a%b , b)
= GCD(b, a%b)
為什麼a%b,b要換位子?
因為要讓左邊的數字比較大。
因為 b > a%b
int GCD(int a,int b){
if (b==0) return a;
return GCD(b,a%b);
}
想想看,
如果呼叫GCD(x,y),其中x<y會怎麼樣?
a
zzzzzzzz
aa
aaa
...
b
ba
...
...
...
密碼的所有可能
a
zzzzzzzz
aa
aaa
...
b
ba
...
...
...
密碼的所有可能