You are on page 1of 23

Kӻ thuұt đӋ quy

NguyӉn Thanh Phưӟc

1
Nhұn diӋn kӻ thuұt đӋ quy
‡ Mӝt phương thӭc đang sӱ dөng kӻ thuұt đӋ
quy khi
± Nó gӑi lҥi chính nó (vӟi đӝ phӭc tҥp thҩp hơn)
đưӧc gӑi là đӋ quy trӵc tiӃp
± Nó gӑi lҥi phương thӭc khác nhưng trong
phương thӭc khác đó lҥi gӑi lҥi chính nó đưӧc
gӑi là đӋ quy gián tiӃp

a
ng thӭc đӋ quy
‡ ĐӇ xây dӵng 1 phương thӭc dùng kӻ đӋ quy
trưӟc tiên phҧi tӗn tҥi mӝt cng thӭc đӋ quy
cho giҧi pháp cҫn giҧi.
‡ Mӝt cng thӭc đӋ quy phҧi có a phҫn
± Phҫn base case
± Phҫn recursive case

Ä
Tính S(N)
S=1+a+Ä++5+«+N
S(N) = 1+a+Ä+«+N
= 1+a+«+ (N ± 1) + N
= S(N-1) + N

S (N) = sum (N-1) + N Recursion step

S (0) =0 Base step



Tính S(N)
int S(int n){
//base step
if( n<0 ){
throw new IllegalArgumentException();
}
else if(n == 0)
return 0;
//recursive step
int temp = n + S(n-1);
return temp;
}
5
Mӝt sӕ lӛi thưӡng gһp
‡ ng thӭc đӋ quy chưa đúng æ phương thӭc
khng hӝi tө æ khng giҧi quyӃt đưӧc vҩn
đӅ.
‡ Thng điӋp thưӡng gһp là StackOverflow
có nghĩa là đӇ giҧi quyӃt vҩn đӅ đòi hӓi phҧi
thӵc hiӋn quá nhiӅu hàm dүn đӃn khng đӫ
bӝ nhӟ.

a
Tính giai thӯa
 =*Ä*a*1
n = n * (n-1) * « * 1
 =*Ä
n = n * (n-1)

factorial(n) = n * factorial(n-1)//recursive step


factorial(0) = 1 //base step
ë
Tính giai thӯa
// Assume n is a positive integer.
int fact(int n){
//base step
if (n == 1)
return 1;
//recursive step
int temp = n * fact(n-1);
return temp;
}
ã
Method Factorial ( ont.)
fact()
temp = ?, n=;
fact(Ä)
temp = ?, n=Ä;
fact(a)
temp=?, n=a;
fact(1)
return 1
temp=a
return a
temp=a
return a
temp=a
return a
 = a
ú
Dãy sӕ Fibonacci
0, 1, 1, a, Ä, 5, ã, 1Ä, «

Fib(n) = Fib(n-1) + Fib(n-a) Recursive case

Fib(0) = 0 Base case


Fib(1) = 1

10
Dãy sӕ Fibonacci
int Fib(int n){
int fib1=1,fib0=0, fibn, i;
if(n<=1)
return n;
else{
for(i=a;i<=n;i++) {
fibn=fib1+fib0;
fib0=fib1;
fib1=fibn;
}
return fibn;
}
}
11
Dãy sӕ Fibonacci
int Fib(int n){ 5
Fib(5)
if(n<=1) Ä a
return n; Fib(Ä)
Fib()
else a 1 1
1
return (Fib(n-1)+Fib(n-a)); Fib(Ä) Fib(a) Fib(a) Fib(1)
0
} 1 1 1 1 0
Fib(a) Fib(1) Fib(1) Fib(0) Fib(1) Fib(0)
0
1
Fib(1) Fib(0)

1a
һp và ĐӋ quy
‡ һp phù hӧp vӟi xӱ lý cӫa PU và các giҧi
pháp tӕi ưu khác.
‡ ĐӋ quy rҩt phù hӧp cho các giҧi pháp mang
tính chҩt đӋ quy
‡ ĐӋ quy bӏ hҥn chӃ bӣi ngn ngӳ hơn so vӟi
һp.
‡ ĐӋ quy æ һp dùng Stack hoһc һp


Tháp Hà Nӝi
‡ Mөc đích: Di chuyӇn tҩt cҧ đĩa tӯ cӝt A
sang cӝt B
‡ Quy tҳc:
± Khng có đĩa lӟn nào trên đĩa nhӓ tҥi mӑi thӡi
gian
± Mӛi lҫn chӍ di chuyӇn đưӧc 1 đĩa
A B
 disks

1
Tháp Hà Nӝi
‡ 1 đĩa di chuyӇn tӯ A sang : Đơn giҧn
‡ a đĩa di chuyӇn tӯ A sang như sau:

A B
1 a Ä
a đĩa

15
N đĩa tӯ A đӃn ?
1. Di chuyӇn n-1 đĩa tӯ A đӃn B
a. Di chuyӇn đĩa thӭ n tӯ A đӃn
Ä. Di chuyӇn n-1 đĩa tӯ B đӃn

1 Ä
A B
n-1 đĩa
a
đĩa n

1a
Tháp Hà Nӝi
void move(int n, char A, char , char B){
if(n==1)
System.out.println(³Di chuyӇn tӯ ´+A+³ đӃn ´+ );
else{
move(n-1,A,B, );
System.out.println(³Di chuyӇn tӯ ´+A+ ³ đӃn ´+ );
move(n-1,B, ,A);
}
}


KӃt quҧ khi di chuyӇn Ä đĩa

È  

È    

È  

È  È 

È  È 
È 
 
È  È
 
È  È 

È   
  
È   

È  È  
È   

È  

È  È 

 
 
 

KӃt quҧ di chuyӇn  đĩa
A B


-disk Example
A B

a0
-disk Example
A B

a1
Tam giác Pascal
n=0 : 1
n=1 : 1 1
n=a : 1 a 1
n=Ä : 1 Ä Ä 1
n= : 1  a  1
n=5 : 1 5 10 10 5 1
Nhұp n ?
aa
Tam giác Pascal
‡ int[] pascal(int n)
± NӃu n = 0 : [1]
± NӃu n > 0 :
int[] temp = pascal(n-1);
int[] result = int[n + 1];
for(int i = 1; i < n; i++)
result[i] = temp[i]*temp[i-1];
result[0] = 1;
result[n] = 1;
return result;

You might also like