Chào các bạn! Vì nhiều lý do từ nay Truyen2U chính thức đổi tên là Truyen247.Pro. Mong các bạn tiếp tục ủng hộ truy cập tên miền mới này nhé! Mãi yêu... ♥

đệ quy

Bài 1:

Giải thuật tính UCLN của hai số nguyên dương p và q(p>q)được mô tả như sau:

Gọi r là số dư trong phép chia p cho q:

• Nếu r=0 thì q là UCLN

• Nếu r≠0 thì gán cho p giá trị của q, gán cho q giá trị của r rồi lặp lại quá trình.

a, Hãy xây dựng một định nghĩa đệ quy cho hàm UCLN(p,q).

b, Viết một giải thuật đệ quy và một giải thuật lặp thể hiện hàm đó.

Lời giải bài 1

a) Định nghĩa ước số chung lớn nhất của hai số là (p>=q)

UCLN(p,q) = q nếu p chia hết cho q

UCLN(q,r) nếu p không chia hết cho q

(r là phần dư của p chia cho q )

b) Chương trình

PROGRAM bai1;

var p,q : integer;

Function ucln(p,q : integer) : integer;

var r : integer;

r := p mod q;

if (r = 0) then ucln := q

else ucln := ucln(q,r)

end;

BEGIN

writeln(' nhap vao 2 so can tim ucln : ') ;

readln(m, n) ;

writeln(' uoc chung lon nhat cua hai so la : ', ucln(m, n));

readln;

END.

Bài 3:

Cho một dãy các số nguyên được xác định như sau:

1 với n=1

an= 3 với n=2

a2n-1 - 2an-2 với n>2

a, viết thủ tục đệ quy xác định giá trị của phần tử thứ n trong dãy.

b, viết thủ tục lặp xác định giá trị của phần tử thứ n trong dãy.

Lời giải bài 3

a,

Function a(n : integer) : integer;

Begin

if (n = 1) then a := 1

else if (n = 2) then a := 3

else a := spr(a(n-1)) - 2*a(n-2)

End;

b, Function (n : integer) : integer;

Var

i : integer;

b : array[1..100] of integer;

Begin

b[1] := 1; b[2] := 3;

for i := 3 to n do

b[i] := sqr(b[i-1])-2*b[i-2];

a := b[n];

End;

Bài 4:

Xét định nghĩa đệ quy:

n + 1 nếu m = 0

Acker (m,n)= Acker(m-1,1) nếu m > 0 và n = 0

Acker(m-1,Acker(m,n-1)) với m > 0 và n > 0

Hàm này gọi là hàm Ackermann. Nó có đặc điểm là giá trị của nó tăng rất nhanh, ứng với giá trị nguyên của m và n.

• Hãy xác định Acker (1,2)

• Viết một thủ tục đệ quy thực hiện tính giá trị của hàm này.

Lời giải bài 4

a(1,2)

= a(0,a(1,1))

= a(0,a(0,a(1,0)))

= a(0,a(0,a(0,1)))

= a(0,a(0,2))

= a(0,3)

= 4

Var

m, n :integer;

Function acker(m, n : integer) : integer;

Begin

if (m = 0) then acker := n+1

else

if (n = 0) then acker := acker(m-1,1)

else acker := acker(m-1,acker(m,n-1))

End;

BEGIN

writeln('nhap m = '); readln(m);

writeln('nhap n = '); readln(n);

writeln('acker(',m,',',n,') = ',acker(m,n));

readln;

END.

Câu hỏi 1: Hãy viết thủ tục đệ quy và không đệ quy biểu diễn số nguyên n thành dãy các chữ số. Ví dụ: số 1989 thành 1 9 8 9

#include"stdio.h"

#include"conio.h"

void ht(int n)

{

if(n<0)

{

printf("-");

n=-n;

}

if (n/10) ht(n/10);

printf(" %d", n%10);

}

void main()

{

clrscr();

printf("Nhap so nguyen:

");a

scanf("%d",&m);

ht(m);

getch();

}

Câu hỏi 2:

Cho biết kết quả trên màn hình khi thực hiện chương trình sau?

Nếu hoán đổi vị trí các câu lệnh 1, 2, 3 thì kết quả sẽ ra sao?

#include"iostream.h"

void Display(int n)

{

if(n<4)

{

1.Display(n+1);

2.Cout<<n;

3.Display(n+1);

}

}

int main()

{

Display(1);

return 0;

}

Bạn đang đọc truyện trên: Truyen247.Pro

Tags: #quy#đẻ