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  .

} else if(n == 0) return 0. Tính S(N) int S(int n){ //base step if( n<0 ){ throw new IllegalArgumentException(). } 5 . return temp. //recursive step int temp = n + S(n-1).

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 đӅ. a . ‡ 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ӟ.

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 ë .

//recursive step int temp = n * fact(n-1). Tính giai thӯa // Assume n is a positive integer. } ã . return temp. int fact(int n){ //base step if (n == 1) return 1.

fact(a) temp=?. Method Factorial ( ont. n=.) fact() temp = ?. fact(Ä) temp = ?. n=a. n=Ä. fact(1) return 1 temp=a return a temp=a return a temp=a return a  = a ú .

a. 5. ã. Dãy sӕ Fibonacci 0. 1Ä. Ä. 1. 1. « Fib(n) = Fib(n-1) + Fib(n-a) Recursive case Fib(0) = 0 Base case Fib(1) = 1 10 .

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

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 .

‡ ĐӋ 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 1Ä . һ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.

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 .

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

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

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

È     .

È    .

È  È  È  È  È    .

È  È   È  È  È     .

 È    .

È  È   È    È    .

È  È        1ã .

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

-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 .

for(int i = 1. i < n. result[0] = 1. i++) result[i] = temp[i]*temp[i-1]. result[n] = 1. int[] result = int[n + 1]. return result. aÄ . Tam giác Pascal ‡ int[] pascal(int n) ± NӃu n = 0 : [1] ± NӃu n > 0 : int[] temp = pascal(n-1).