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 :smile:

#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\n", TongCacPhanTu(a,n));
	system("pause");
}

đ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 :joy:
nói chung mình chưa hiểu bạn định làm gì

:joy: à 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 :cold_sweat:

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?

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

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

1 Like

À :smiley: Thế thì cứ làm nhé :slight_smile:
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 :slight_smile:

ừ bạn :slight_smile: 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 :smile:

1 Like

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);
	}
}

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

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

Bạn này thật sự hiểu đệ quy dấy bạn ạ , nếu như đem dequy xuống dưới như bạn khi nó chạy đế cuối cùng n=0(cái này debug rồi hiểu nhé) nó lần lượt trả về n=1 nhưng nếu như vậy thì nó đã in nhập mảng 9 rồi nhé :)) bạn học kĩ sẽ thấy đệ quy nó giống stack như thế nào

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, …) :smiley: để sau này hiểu đại thể, nhưng vẫn phải debug :slight_smile:

1 Like

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 à :joy: 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.

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

1 Like

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

chú ý return về 0 nhé b :v
dưới đây là một cách tương tự

#include<iostream>
using namespace std;
int tongmang(int a[],int n);
int main()
{
	
	int b[100];
	int m;
	cout<<"moi nhap so phan tu :";
	cin>>m;
	cout<<"moi nhap tung phan tu :";
	for(int i = 0;i < m;i++)
	{
		cout<<"a["<<i<<"]";
		cin>>b[i];
		
	}
	cout<<"mang vua nhap :\n ";
	for( int i = 0;i < m ;i++)
	
{
	cout<<b[i]<<"\t";
	cout<<"\ntongmang : = "<<tongmang(b,m - 1)<<endl;
	return 0;
	}
}

int tongmang(int a[],int n)
{
	if(n == 0)
	{ 
	return a[0];
	return a[n - 1] + tongmang(a,n - 1);
		}		
}

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

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