30/09/2018, 21:35

[C/C++] Đệ Quy - Tìm Max, Min

Anh chị nào hiểu cách tìm của chương trình tìm Max, Min không chỉ em với ạ, em xem mà không hiểu cách nó chạy ra sao để được giá trị Max, Min

int Min(int A[], int n)
{
	if (n == 0)
		return -1;
	if (n == 1)
		return A[0];
	else
	{
		if (A[n - 1] < Min(A, n - 1))
			return A[n - 1];
		else
			return Min(A, n - 1);
	}
}

int Max(int A[], int n)
{
	if (n == 0)
		return -1;
	if (n == 1)
		return A[0];
	else
	{
		if (A[n - 1] > Max(A, n - 1))
			return A[n - 1];
		else
			return Max(A, n - 1);
	}
}
void main()
{
	unsigned int n;
	int A[10] = { 4, 6, 3, 19, 22, 34, 67, 54, 15, 24 };
	printf("Gia Tri Nho Nhat Cua Mang: %d
", Min(A, 10));
	printf("Gia Tri Lon Nhat Cua Mang: %d
", Max(A, 10));
}
Người bí ẩn viết 23:48 ngày 30/09/2018

Anh chị nào hiểu cách tìm của chương trình tìm Max, Min không chỉ em với ạ, em xem mà không hiểu cách nó chạy ra sao để được giá trị Max, Min

Cái này không nhất thiết phải dùng đệ quy đâu bạn !

Cách 1:
Thuật toán: Gán biến Max và Min bằng 1 giá trị bất kỳ trong mảng và dùng vòng lặp để sánh Max và Min với tất cả các giá trị còn lại trong mảng, nếu có giá trị nào lớn hơn cả Max hoặc nhỏ hơn cả Min thì cập nhật giá trị đó và Max và Min, cứ như thế cho đến khi kết thúc vòng lặp sẽ tìm được giá trị Max và Min

Cách 2:
Thuật toán: Gán biến Max với giá trị bé nhất có thể và biến Min với giá trị lớn nhất có thể. Vậy giá trị lớn nhất và bé nhất là gì ?
Bạn #include <limits.h> và gán Max = INT_MINMin = INT_MAX nhé !
Sau đó vẫn dùng vòng lặp duyệt mảng, nếu giá trị nào bé hơn cả Min hay lớn hơn cả Max thì cập nhật phần tử đó cho 2 biến Max và Min. Cuối cùng, ta sẽ tìm được Max và Min.

Ví dụ code của bạn khai báo mảng A gồm 10 phần tử thì cho vòng lặp chạy từ 0 đến 9 và làm như cách trên ! Còn lại bạn tự tìm hiểu và giải nhé

Thanh Bình Lê viết 23:40 ngày 30/09/2018

Bài của mình là bắt buộc dùng đệ quy rồi bạn, mình hiểu cách của bạn rồi nhưng mà đề thì chỉ cho làm theo đệ quy thôi

Người bí ẩn viết 23:52 ngày 30/09/2018

Thế thì nhờ các member khác giúp chứ bài này dùng đệ quy cũng rối và mất thời gian mà mình lại không có thời gian

Thanh Bình Lê viết 23:43 ngày 30/09/2018

vậy mình cảm ơn bạn đã giúp mình nha

chichi viết 23:46 ngày 30/09/2018

Ý tưởng tìm min tại vị trí k là đã biết min của a[0] -> a[k-1] xong so sánh gía trị ấy với a[k] thằng nào bé hơn là min, bạn có thể debug để hiểu hơn

void viết 23:38 ngày 30/09/2018
#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 << b << endl;
  return 0;
}
Củ Chuối viết 23:38 ngày 30/09/2018

Mình nói về Min nha, ban đầu đệ quy chạy từ trên xuống, phân tích thành các bài toán nhỏ nhất, đến khi Min(A,1) (ở đây là 4) thì sẽ chạy ngược lên đê so sánh
if (A[n - 1] < Min(A, n - 1)) return A[n - 1]; else return Min(A, n - 1);

Reoteu Ray viết 23:44 ngày 30/09/2018

mình thấy đệ quy là pp rất tốn bộ nhớ máy tính và cũng ít khi dùng đến nó , chương trình viết bằng đệ quy thì công nhận là gọn và ngắn thật nhưng tốc độ chạy và ngốn bộ nhớ stack của nó thì kinh khủng…

Thanh Bình Lê viết 23:45 ngày 30/09/2018

Cảm ơn bạn nhiều nha, cách của bạn hay quá

Thanh Bình Lê viết 23:40 ngày 30/09/2018

Mình đã hiểu cái code của mình rồi, cảm ơn bạn nhiều lắm nha

Thanh Bình Lê viết 23:46 ngày 30/09/2018

Cái này mình đang hỏi về đệ quy đó bạn, mình tìm được lời giải thích cho mình rồi, bạn tham khảo luôn nhé

Thanh Bình Lê viết 23:36 ngày 30/09/2018

Cái này có trong đề cương ôn thi của mình, mà khi ra đi làm thì đệ quy không được dùng nhiều hả bạn

Bài liên quan
0