1. Trang chủ
  2. » Giáo án - Bài giảng

Bai 08 de quy trong c++

17 1 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Đệ Quy Trong C++
Định dạng
Số trang 17
Dung lượng 895,46 KB

Nội dung

Bài giảng nhập môn lập trình của trường đại học công nghệ thông tin, chương 8. Bài giảng là slide powerpoint cung cấp đầy đủ kiến thức, bài tập, kỹ năng cho sinh viên về chương 8 của môn nhập môn lập trình

Trang 1

ĐỆ QUY (RECURSION)

Trang 2

3 Nội dung

Trang 3

Đệ quy

thể được giải quyết thông qua kết quả của

chính vấn đề đó nhưng với đầu vào đơn giản hơn

Trang 4

Đệ quy – thuật ngữ

Recursion – Đệ quy

Recursive – Tính đệ quy

Recursive problem – Vấn đề đệ quy

Trang 5

Trường hợp cơ bản

nhỏ để ta có thể giải quyết vấn đề mà không cần lời gọi đệ quy

5

Trang 6

Đệ quy trong C++

thân hàm

int giai_thua(int n)

{

if (n == 0 ) return 1 ;

else

{

int kq = n * giai_thua(n - 1 );

return kq;

}

}

Trang 7

Phân loại đệ quy

hợp đệ quy chỉ đề cập lại đến nó một lần

hợp đệ quy đề cập lại chính nó nhiều lần

hợp hiếm gặp khi hàm không trực tiếp gọi lại

chính nó mà thông qua hàm khác

Trang 8

Đệ quy tuyến tính

lại chính nó

int giai_thua(int n)

{

if (n == 0 ) return 1 ;

else return n * giai_thua(n - 1 );

}

nhưng chỉ một lần được chạy

int uscln (int a , int b )

{

if ( a == b ) return a ;

Trang 9

Đệ quy tuyến tính

có chức năng tương đương ➔ Khử đệ quy

int giai_thua(int n) {

if (n == 0 ) return 1 ;

else return n * giai_thua(n - 1 );

}

int giai_thua (int n ) {

int kq = 1 ;

for (int i = 1 ; i <= n ; i ++){

kq = kq * i ; }

return kq ; }

Trang 10

Đệ quy tuyến tính

dùng ít bộ nhớ hơn ➔ chạy được input lớn

hơn

int tong (int n )

{

if ( n > 0 ) return n + tong ( n - 1 ) ;

else return 0 ;

}

int tong_2 (int n ) {

int kq = 0 ;

for (int i = 1 ; i <= n; i ++) {

kq = kq + i;

}

return kq;

}

int main()

{

for(int i = 0 ; i < 1000 ; i++)

{

Trang 11

Đệ quy phi tuyến

12

F(0) F(1) F(2) F(3) F(4) F(5) F(6) F(7) F(8)

Trang 12

Đệ quy phi tuyến

→ trường hợp đặc biệt của đệ quy phi tuyến: đệ

quy nhị phân

int fibonacci (int n ) {

if ( n < 2 ) return 1 ;

else return fibonacci ( n - 1 ) + fibonacci ( n - 2 ); }

Trang 13

Đệ quy hỗ tương

quy gián tiếp – indirect recursion

qua một (hoặc nhiều) hàm khác

14

Hàm_1() {

… Hàm_2()

… }

Hàm_2() {

… Hàm_ ()

… }

Hàm_ () {

… Hàm_1()

… }

Trang 14

Call stack

tạo ra một phần tử mới trong stack

phần tử ở đỉnh của stack trước

{

…;

A();

…;

D();

…;

}

main()

{

…;

B();

…;

C();

…;

A() { …;

}

C()

{

…;

D();

…;

}

B()

{

…;

D()

main

A

D

D

D

Trang 15

Call stack và đệ quy

f(3) f(3) f(3) f(3) f(3) f(3) f(3) F(3) F(3) f(2) f(2) f(2) f(2) f(2)

f(4) f(4) f(4) f(4) f(4) f(4) f(4) f(4) F(4) F(4) f(4) f(4) f(4) f(4) f(4) f(4) f(4)

main main main main main main main main main main main main main main main main main main main

int f (int n )

{

if ( n < 2 ) return 1 ;

else {

return f ( n - 1 ) + f ( n - 2 ) ;

} }

int main () {

cout << f ( 4 ) ; }

 Tại một thời điểm, stack chỉ có thể chứa số lượng phần tử có hạn.

 Khi chiều cao của stack quá lớn,

chương trình có thể sẽ gặp lỗi stack overflow

Trang 16

Bài tập

• Viết hàm đệ quy giải các bài toán:

dương n

2 Tính giá trị của x lũy thừa n

3 Tính giá trị của n!

4 Tính ước số chung nhỏ nhất của 2 số

nguyên.

5 Tìm số thứ n của dãy Fibonacci

7 Bài toán Tháp Hà Nội

Trang 17

Bài tập

void ThapHaNoi( int n, char a, char b, char c)

{

if ( n ==1) {

cout <<"\t"<< a << " ->" << c << endl ;

return ;

}

ThapHaNoi (n-1,a,c,b);

ThapHaNoi (1,a,b,c);

ThapHaNoi (n-1,b,a,c);

}

Ngày đăng: 04/03/2024, 11:25

TỪ KHÓA LIÊN QUAN

w