30/09/2018, 21:05

Hàm tính tổng các phần tử trong mảng nguyên bằng đệ quy

Em đang viết hàm tính tổng các phần tử trong mảng nguyên bằng đệ quy nhưng lại bị lỗi mà e ko biết sửa ntn. mong mọi người thông giúp em với

#include <stdio.h>
#include <stdlib.h>

void NhapMang(int a[], int n)
{
	if(n > 0)
	{
		NhapMang(a, (n-1));
		printf("Nhap phan tu thu %d: ",n);
		scanf("%d", &a[n-1]);
	}
}

int TongCacPhanTu(int a[], int n)
{
	if(n = 1)
	{
		return TongCacPhanTu(a, n);
		printf("%d", n);
	}
	return TongCacPhanTu(a, (n-1)+n);
	printf("%d", (n-1)+n);
}

void main()
{
	int a[100], n;
	printf("Nhap so phan tu cua mang: ");
	scanf("%d", &n);
	NhapMang(a,n);
	TongCacPhanTu(a, n);
	printf("Tong cac phan tu trong mang la: %d
", TongCacPhanTu(a,n));
	system("pause");
}
Chế Tiệp Chân Khoa viết 23:13 ngày 30/09/2018

NhapMang(a, (n-1));
printf(“Nhap phan tu thu %d: “,n);
scanf(”%d”, &a[n-1]);

đem NhapMang(a, (n-1)); xuống dưới
bạn chưa scanf mà đã call hàm rồi
còn sai nhiều lắm, chỗ if(n=1) sẽ đệ quy vĩnh viễn
nói chung mình chưa hiểu bạn định làm gì

Lép Xẹp viết 23:13 ngày 30/09/2018

à tại mình nghỉ là nếu n = 1 thì mảng có 1 chữ số nên trả về mảng luôn. Vậy là sai rồi

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

Tổng các phần tử trong mảng nguyên th dùng vòng lặp ok rồi, cần gì recursion?

Tao Không Ngu. viết 23:05 ngày 30/09/2018

This post was flagged by the community and is temporarily hidden.

Lép Xẹp viết 23:06 ngày 30/09/2018

dùng vòng lặp thì dễ quá nhưng mà thầy đang cho bài tập bắt xài đệ quy

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

À Thế thì cứ làm nhé
Nhưng sau này, bạn sẽ hiểu là nên giải 1 bài toán bằng cách ngắn gọn nhất. Đệ quy hình như có làm tốn bộ nhớ hơn ấy

Lép Xẹp viết 23:19 ngày 30/09/2018

ừ bạn thầy cũng nói là bí lắm thì mới xài đệ quy hoặc là bị bắt ép xài thì mới xài . còn ko thì không nên xài. dù sao cũng cảm ơn bạn

cescnghia viết 23:16 ngày 30/09/2018

Bạn đã làm chưa ? Đây cũng là 1 cách làm nè:

int recursion(int* tab, int len, int acc);

int main(void) {
	
	int tab[] = {1,2,3,4,5,-15};

	printf("%d\n", recursion(tab, 6, 0));

	return 0;
}

int recursion(int* tab, int len, int acc){
	if (len < 0)
		return acc;
	else {
		int newAcc = acc + tab[--len];
		return recursion(tab, len, newAcc);
	}
}
Lép Xẹp viết 23:10 ngày 30/09/2018

cảm ơn bạn mình sẽ lưu lại cách này để tham khảo. Sáng thầy mới sửa

rogp10 viết 23:18 ngày 30/09/2018

Bây giờ thì phải lần từ từ để hiểu (stack trace, chạy tay: lệnh phải chạy từ 1, 2, 3, …) để sau này hiểu đại thể, nhưng vẫn phải debug

HK boy viết 23:15 ngày 30/09/2018

1 YEAR LATER

Có ai đó đang dùng IE thì phải…

if(n = 1)

Chỗ này đợi đệ quy đến mùa quýt à n=1 thì kết thúc mọi thứ luôn rồi.

Đem đệ quy xuống dưới hay lên trên cũng như nhau cả thôi, chỉ là đem xuống dưới thì thuận mắt và dễ debug hơn thôi.

rogp10 viết 23:18 ngày 30/09/2018

Không hẳn, đệ quy đuôi sẽ ra 9, 8, 7, 6, 5, … còn muốn 1, 2, 3, … thì viết như thớt.

Jacaré Junior viết 23:07 ngày 30/09/2018

Bạn truyền size mảng vào rồi trừ nó đi, nhỏ hơn 0 thì dừng… cách đó thử xem :v

nguyễn siêu viết 16:36 ngày 10/05/2021
#include<stdio.h>
int nhapMang(int a[], int n)
{
for (int i = 0; i < n; i++)
{
printf(" a[%d] =", i);
scanf_s("%d", &a[i]);
}
return a[n];
}
int tongDeQuy(int a[], int n)
{
if (n == 0)
return a[n];
return a[n]+ tongDeQuy(a, n-1);
}
int main()
{
int a[100];
int n;
printf("nhap do dai mang A:");
scanf_s("%d", &n);
nhapMang(a, n);
xuatMang(a, n);
printf("tong = %d", tongDeQuy(a, n));
}
viết như thế này có sai ở đâu k ạ
Bài liên quan
0