viết hàm trả về phần tử chẵn lớn nhất trong mảng có n phần tử bằng đệ qui

ad và các bạn giup hộ e bài này vs:
viết hàm trả về phần tử chẵn lớn nhất trong mảng có n phần tử bằng đệ qui. nếu ko tìm đc thì trả về -1.

3 Likes
#include <stdio.h>

/*
 * int* array: mang phan tu
 * int n: so luong phan tu
 * int i: index
 * int* max: phan tu chan lon nhat
 *      max == -1 neu khong co phan tu lon nhat
 */
int chan_lon_nhat(int* array, int n, int i, int* max)
{
    if (i == n) // cuoi' mang?, return max
        return *max;
    int phan_tu = *(array + i);// lay phan tu vi tri i
    if ( phan_tu%2 == 0) // neu la so chan
        if (*max < phan_tu) // lon hon max
            *max = phan_tu; // cap nhat max

    return chan_lon_nhat(array, n, ++i, max); // tinh tiep voi ++i
}

int main()
{
    int array[] = {1,2,3,4,5,6,7,8,9}; // khoi tao mang
    int max = -1; // gan max bang -1
    // in ra
    printf("Phan tu chan lon nhat = %d",
           chan_lon_nhat(array,sizeof(array)/sizeof(int),0,&max));
    return 0;
}

7 Likes

Đây là cách mình được thầy Nguyễn Tấn Trần Minh Khang dạy, khá hay, bạn có thể tham khảo.

// ChanLonNhat_DeQuy.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"

int ChanLonNhat(int * a, int n);

int _tmain(int argc, _TCHAR* argv[])
{
	int *a;
	int n;
	std::cout << "Nhap n: ";
	std::cin >> n;
	a = new int(n);
	for (int i = 0; i < n; i++)
	{
		std::cout << "Nhap a[" << i << "] : ";
		std::cin >> a[i];
	}
	int temp = ChanLonNhat(a, n);
	if (temp == -1)
		std::cout << "Mang khong co so chan" << std::endl;
	else
	std::cout << " Ket qua: " << temp <<std::endl;

	system("pause");
	return 0;
}

int ChanLonNhat(int * a, int n)
{
	if (n == 0)
		return -1; //Mang rong, khong ton tai so chan
	if (n == 1)
	{
		if (a[0] % 2 == 0)
			return a[0];
		else
			return -1;
	}
	
	if (a[n - 1] % 2 == 0 && a[n - 1] > ChanLonNhat(a, n - 1))
		return a[n - 1];
	else
		return ChanLonNhat(a, n - 1);
			
}
2 Likes

hihi. cảm ơn add và các bạn. :smile:

1 Like

add Dat oi, e ko hiểu câu lệnh lấy phân tử trong mảng. vs cả add dùng con trỏ nhưng ko dùng con trỏ có làm sao ko?. em sửa lại code của add cho e dễ hiểu tí. :blush:

#include<stdio.h>
#include<conio.h>

int Chan_lon_nhat(int A[],int n, int i,int max)
{
	if(i==n) return max;
	if((A[i]%2==0) && (A[i]>max)) max=A[i];
	return Chan_lon_nhat(A,n,++i,max);
}

int main()
{
	int A[]={1,2,3,4,5,6,7,8,9,10,11,13};
	int max=-1;
	printf ("\n Phan tu chan lon nhat trong mang: %d",Chan_lon_nhat(A,sizeof(A)/sizeof(int),0,max));
	
	getch();
	return 0;
}
1 Like

A[i] tương đương với *(array + i). Vậy là được rồi :smile:

À được, như vậy thì max không thay đổi giá trị, làm vậy cũng được. Sửa lại vậy là hiểu code rồi đó.

1 Like

Người thảo luận để tìm ra cách giải hay cho một bài toán khó sẽ trở thành lập trình viên giỏi. Người hay hỏi bài tập thì không. :blush:

2 Likes

Đó chính là cái mọi người ở http://daynhauhoc.com muốn hướng đến đó. Lần sau đặt câu hỏi nhớ thể hiện là mình đã nghiên cứu trước nha. Lần này xí xóa :))

3 Likes

hehe. tại e làm mãi ko ra. :slight_smile: lần này xí xóa. ok ok. thank add!!!

2 Likes

À, cho anh sửa thêm cái nữa.

Ad là viết tắt của admin. Admin là viết tắt của administrator. Add là động từ “thêm vào” :slight_smile:
Anh tên Đạt, ở nhà mọi người hay gọi anh là ad cho nhanh, có nghĩa là Anh Đạt. Giờ lên FB ai cũng gọi ad thấy kỳ kỳ sao đó.

2 Likes

thì a là admin của diễn đàn còn gì. :smiley: . còn cái add là e viết nhầm. :smile: ok?

1 Like

haha, thấy kỳ kỳ, em cứ ghi @ltd là anh sẽ được notify à

rồi rồi. lần nữa thank ad và các bạn. :blush:

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