You are on page 1of 7

Bài tập về nhà 2:

Nguyễn Thành Nam


Mssv: 20193031
1.1Code đệ quy kiểm tra dãy fibonaci:
#include<iostream>
using namespace std;
int fb(int n)
{
if (n == 1 || n == 0 || n == 2 || n == 3) return n; //2
return fb(n - 2) + fb(n - 1); // 2^n
}
int main()
{
int i, n, d = 0; //1
cout << "n = "; //1
cin >> n; //1
for (i = 0; i <= n; i++) //n+2
if (n == fb(i))
{
d++; //2 * n+1
}
if (d == 1) cout << n << " thuoc day fibonacci"; //1
else cout << n << " khong thuoc day fibonacci"; //1

}
Em chưa biết thực hiện đếm số phép toán đệ quy ạ, liệu nó có cộng dồn ko ạ ?
T(n) = 2^n + … => O(n)= log2(n) ?
1.2Code sử dụng vòng lặp:
#include <iostream>
using namespace std;
int Fb(int n)
{
int a1 = 1, a2 = 1; //1
if (n == 1 || n == 2) //1
return 1; //1
int i = 3, a; //1
while (i <= n) // n-1
{
a = a1 + a2; //
a1 = a2; //
a2 = a; //4 lệnh này * n-2
i++; //
}
return a; //1
}
int main()
{
int n, i, d = 0; //1
cout << "nhap n: ";//1
cin >> n; //1
for (i = 0; i <= n; i++) //n+2
if (n == Fb(i)) //
{
d++; // 2* n+1
}
if (d == 1) cout << n << " thuoc day fibonacci"; //1
else cout << n << " khong thuoc day fibonacci"; //1
}

T(n)= 4+ n-1 + 4*(n-2) +4 + n+2 + 2(n+1) +2= 8n+5


Em bị lỗi debug ở dòng 16 của code mà không biết tại sao nó lỗi vì code này vẫn chạy
bình thường trên dev c. mong cô giúp em ạ.
2.1 code đệ quy giai thừa: input : n ; output : n!
#include <iostream>
using namespace std;
int giaiThua(int n)
{
if (n == 1)
return 1;
return n * giaiThua(n - 1);
}
int main()
{
int n;
cin >> n;
cout << "Giai thua " << n << " la: " << giaiThua(n);
return 0;
}
T(n) = ? => O(n) = log(n)
Code giai thừa xử dụng vòng lặp for :
#include <iostream>
using namespace std;
int giaiThua(int n)
{
int giai_thua = 1; //1
for (int i = 1; i <= n; i++) //n+1
giai_thua *= i; // n
return giai_thua; //1
}
int main()
{
int n; //1
cin >> n; //1
cout << "Giai thua " << n << " la: " << giaiThua(n); //1
return 0; /1
}

T(n) = 2n+7
3.1 code min max bằng đệ quy input :1, 7, 3, 4, 5, 6 ; output : max :7 min :1
#include <iostream>
using namespace std;

#define MAX(x1, x2) (((x1) > (x2)) ? (x1) : (x2))


#define MIN(x1, x2) (((x1) > (x2)) ? (x2) : (x1))

int max(int* arr, int n)


{
if (n == 2)
{
return MAX(arr[0], arr[1]);
}

return MAX(arr[n - 1], max(arr, n - 1));


}

int min(int* arr, int n)


{
if (n == 2)
{
return MIN(arr[0], arr[1]);
}

return MIN(arr[n - 1], min(arr, n - 1));


}

int main()
{
int arr[] = { 1, 7, 3, 4, 5, 6 };
int a = max(arr, 6);
int b = min(arr, 6);
cout << a << endl << b << endl;
return 0;
}
3.2 max min bằng vòng lặp for
#include<iostream>
using namespace std;
int main()
{
int arr[] = { 1, 7, 3, 4, 5, 6 }; //1
int min = arr[0], max = arr[0]; //1
for (int i = 0; i < 6; i++) { //7
if (max < arr[i]) //
max = arr[i]; //
else if (min > arr[i])// 4* 6 =24
min = arr[i]; //
}
cout << max << endl << min << endl; //1
return 0; //1
}
T(n) =25
Nhận xét : hàm đệ quy theo dự đoán sẽ cộng dồn và rất tốn bộ nhớ nên không
được ưu tiên sử dụng như vòng for.

You might also like