Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

Mọi người ơi e muốn hỏi về thuật toán đệ quy cũng như hướng giải với. Bài này hơi khoai

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

Điều kiện dừng là 0; khi gặp 0 return 0; Return n+tenham(n-2); Nếu n%2==0; Ví dụ n=6 Tông sẽ là: 6+4+2; Khi n%2!=0 thì có nghĩa n là số lẻ thì trả kq khác. Ví dụ số 5. Thì return (n-1)+tenham((n-1)-2);

Vì là số lẻ nên lui 1 đơn vị sẽ ra số chẵn

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy
sycoi001:

Ví dụ n=6
Tông sẽ là: 6+4+2;

n = 234252

Sum = 2 + 4 + 2 + 2 = 10

1 Like

bác hiểu nhầm ý e rồi, ý e là nếu số n có dạng xyz, nếu x hoặc z là số chẵn thì tính tổng x+z cơ bác ạ

bài trên suy nghĩ sai.

int dequy(int n){ if (n<0) return -1; // dung khi n<0 int k=(n%10)%2; // so du chia het cho 2. if ((n/10)==0){ return n; // neu n chia 10 = 0 return 0. }else if (k==0){ // neu so du = 0. return n%10+ dequy(n/10); // vi du 20: 20%10 = 0 + 20/10 = 2 }else return dequy(n/10); //nguoc lai n/10 !=0 va so du != 0 vd: 201/10 = 20. 20/10 = 2. }

3 Likes

Home Categories FAQ/Guidelines Terms of Service Privacy Policy

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

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

#include #include 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"); }

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy
Lep_Xep:

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

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy


nói chung mình chưa hiểu bạn định làm gì

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy
à 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
Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

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á

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy
nhưng mà thầy đang cho bài tập bắt xài đệ quy
Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

1 Like

À

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy
Thế thì cứ làm nhé
Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

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
Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

ừ bạn

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy
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
Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

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

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy
mình sẽ lưu lại cách này để tham khảo. Sáng thầy mới sửa
Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

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, …)

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy
để sau này hiểu đại thể, nhưng vẫn phải debug
Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

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 à

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy
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, …

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy
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 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["<>b[i]; } cout<<"mang vua nhap :\n "; for( int i = 0;i < m ;i++) { cout<

Cho mảng 1 chiều các số nguyên viết hàm tính tổng các số chẵn trong mảng bằng phương pháp de quy

Hàm gọi lại chính nó được gọi là đệ quy. Hàm đề quy có 4 loại bao gồm:

  1. Đệ quy tuyến tính => Thân hàm gọi 1 lần chính nó
  2. Đệ quy nhị phân => Thân hàm gọi 2 lần chính nó
  3. Đệ quy phi tuyến => Thân hàm lặp gọi 1 số lần chính nó
  4. Đệ quy hỗ tương => 2 hàm đệ quy gọi nhau

Sau đây chúng ta cũng tìm hiểu những dạng bài nào được viết dạng đệ quy.

1. Hàm nhập, xuất mảng đệ quy

void nhapmang(int a[], int n){ if(n==0) return; nhapmang(a, n-1); printf(“\nNhap phan tu %d: “,n-1); scanf(“%d”,&a[n-1]); }void xuatmang(int a[], int n){ if(n == 0) return; xuatmang(a, n-1); printf(“%4d”,a[n-1]);

}

2. Hàm xuất mảng ngược

Vd: Mảng a[5]={2, 4, 5, 3, 9} thì ta có mảng ngược là a[5]={9, 3, 5, 4, 2}

void xuatmangnguoc(int a[], int n){ if(n == 0) return; printf(“%4d”,a[n-1]); xuatmangnguoc(a, n-1);

}

3. Tính tổng n

Vd: n = 5 thì ta có S = 1 + 2 + 3 + 4 + 5

//Dung de quy long tong(int n){ if(n==0) return 0; return n + tong(n-1);

}

4. Đếm mảng các số chẵn

Chú thích: Chúng ta sẽ đếm những số chẵn có trong mảng có bao nhiêu số.

int demchan(int a[], int n){ if(n == 0) return 0; if(n % 2 == 0) return 1 + demchan(a,n-1); return demchan(a,n-1);

}

5. Đếm mảng các số nguyên tố

bool ktnt(int n){ int d=0; for(int i=1; i< n; i++){ if(n%i==0) d=d+1; } if(d==1) return true; return false; } int demsonguyento(int a[], int n){ if(n==0) return 0; if(ktnt(a[n-1])) return 1 + demsonguyento(a, n-1); return demsonguyento(a, n-1);

}

6. Hàm tổng mảng

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

}

7. Hàm tổng mảng chẵn

long tongmangchan(int a[], int n){ if(n==0) return 0; if(a[n-1] % 2 == 0) return a[n-1] + tongmangchan(a, n-1); return tongmangchan(a, n-1);

}

8. Hàm tính tổng các giá trị lớn hơn giá trị đứng trước nó.

Vd: 5, 6, 9, 1, 2 thì ta có S= 6 + 9 + 2 vì 5 < 6 ta lấy 6, 6 < 9 ta lấy 9…

long tonglhdt(int a[], int n){ if(n==0) return 0; if(a[n-1] > a[n]) return a[n-1] + tonglhdt(a,n-1); return tonglhdt(a, n-1);

}

9. Kiểm tra mảng toàn chẵn

bool kttoanchan(int a[], int n){ if(n==0) return true; if(a[n-1] % 2 != 0) return false; return kttoanchan(a, n-1);

}

10. Hàm tìm max trong mảng

int timmax(int a[], int n){ if(n==1) return a[0]; if(a[n-1] > timmax(a,n-1)) return a[n-1]; return timmax(a,n-1);

}

11. Tìm vị trí max trong mảng

int timvitrimax(int a[], int n){ if(n==1) return 0; if(a[n-1] > a[timmax(a,n-1)]) return n-1; return timmax(a,n-1);

}

12. Hàm xếp tăng mảng

void sapxeptang(int a[], int n){ if(n==1) return; for(int i=0;i a[n-1]){ int tam = a[i]; a[i]=a[n-1]; a[n-1]=tam; } } sapxeptang(a,n-1);

}

13. Giả xử x1=1, x2 =1, xn=x(n-1) + (n-1)*x(n-2) 

Viết hàm tính xn bằng đệ quy.

long tinhdequy(int n){ if(n==1 || n==2) return 1; return tinhdequy(n-1) + (n-1)*tinhdequy(n-2);

}

14. Tính số hạng n của dãy Fibonacci sau.

f1=1

f2=1

fn=fn-1 + fn-2, n>=3

long Fibonaci(int n){ if(n==1 || n==2) return 1; return Fibonaci(n-1) + Fibonaci(n-2);

}

15. Tìm UCLN của 2 số nguyên dương

int UCLN(int c, int b){ if (c == b) return c; if (c > b) return UCLN(c – b, b); else return UCLN(c, b – c);

}