Lỗi bài toán đệ quy tìm phần tử lớn nhất trong mảng

Đây là đoạn code của em:

int findMax(int a[], int n)
{
	int max = a[n-1];
	if (n == 1) return max;
	if (a[n - 2] > max) return max=a[n-2];
	else return findMax(a,n-1);
}

Em không biết vì sao đoạn code này lại sai ( em vẫn không tìm được lỗi của nó ở đâu, kiểu có một vài trường hợp em nhập nó đúng rồi một vài trường hợp nó lại sai). Em đã tham khảo thử mấy cách trên mạng nhưng em vẫn không biết mình sai chỗ nào. Mong mn giúp đỡ!

Tại sao khi a[n - 2] lớn hơn max lại trả về a[n - 2]. :smiley:

6 Likes

Đệ quy này sẽ không thể duyệt hết mảng a[] chiều dài n mà sẽ dừng ngay khi xuất hiện 1 cặp thỏa mãn a[n-2] > a[n-1]
tức là a[] = {1,2,3,4,5,2,3,2,2,2,2} sẽ trả về 3 thay vì 5.

4 Likes

tại em nghĩ là mình sẽ gán giá trị max cho thằng a[n-2] nên lúc đó mình cũng return nó về giá trị max luôn ( theo em là như z :sweat_smile:).

À ra vậy.

Dạng này thì bạn phải tìm công thức truy hồi :slight_smile: rồi chuyển qua đệ quy đuôi hay ko thì tùy.

3 Likes

Em cứ nghĩ là nó sẽ chạy tiếp không nghĩ là đến chỗ {…,3,2,2,…} nó sẽ thoát ra.
Dạ em cảm ơn !

1 Like

Đệ quy đuôi là sao z bạn tại mấy cái này mình mò trên mang nên không rành lắm. Chỉ biết đệ quy khá giống quy nạp nên mình việt hàm theo quy nạp thôi!

sau này để gỡ rối bạn chỉ cần ghi log ra ví dụ:

System.out.println("Step: Hà mã đang ăn")

để hiểu function mình viết nó chạy có như mong muốn/đúng step không là được

5 Likes

Khi lời gọi đệ quy cũng là câu lệnh kết thúc hàm (lưu ý không phải là dạng return g(f(new_args)) mà phải là [return] f(new_args)) thì lời gọi ấy gọi là đệ quy đuôi.

5 Likes

Vậy là giá trị của mảng bị thay đổi hả. :thinking:

Làm như anh Rogp10 thì có cách như này nè.

  • Mảng có 1 pt => max là giá trị phần tử duy nhất đó.
  • Mảng có n pt => max là max của phần tử bất kỳ và max của mảng loại đi phần tử đó.

Thường ta sẽ loại phần từ đầu hoặc cuối cho dễ. :kissing:

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?