Đoạn code tính S = 2/2*3 + 3/3*4 +...+ n/n*(n+1) bị sai

Cho mình hỏi đoạn code này sai gì mà run chương trình ko ra kqủa v ạ?

#include<stdio.h>
#include<math.h>
// Cau a: Su dung de quy
int Tinh(int n)
{
	int i, S = 0;
	if(n == 1)
		return 0;
	return Tinh(n-1) + i/(i*(i+1));
}

// Cau b: Khong su dung de quy
int TinhS1(int n)
{
	int i, S1 = 0;
	for(i = 1; i <= n; i++)
    	S1 = S1 + (float)i/(i*(i+1));
}

int main()
{
	int n;
	do
  {
    printf("\nNhap so nguyen n: ");
    scanf("%d", &n);
    if(n < 0)
    {
      printf("Nhap sai. Nhap lai!!!");
    }
  }while(n < 0);
  printf("\nSu dung de quy:");
  printf("\nTong S = 1/2 + 2/3 + ... + n/n+1 bang de quy la: %2f", n, Tinh(n));
  printf("\n\nKhong su dung de quy:");
  printf("\nTong S = 1/2 + 2/3 + ... + n/n+1 bang de quy la: %2f", TinhS1(n));
  return 0;
}

Hàm Tinh sai hay hàm TinhS1 bị sai ?

printf("\nTong S = 1/2 + 2/3 + … + n/n+1 bang de quy la: %2f", n, Tinh(n));
-> dòng này sai %2f, sửa lại thành %2d bởi vì hàm tính tổng Tinh(n) trả về kiểu int chứ không phải kiểu float, và truyền thừa biến n.
printf("\nTong S = 1/2 + 2/3 + … + n/n+1 bang de quy la: %2f", TinhS1(n));
-> 2 dòng này sai chỗ %2f, phải là %2d

Hàm Tinh(n) bên trên chưa khởi tạo i; biến S khai báo thừa, không dùng tới thì xoá đi.

Bạn có thấy vấn đề gì ở 2 biến iS không?

  1. 2 biến này vô dụng. Vì đệ quy không cần dùng đến.
  2. Nó vô dụng nhưng bạn vẫn dùng đến i (có khai báo, nhưng không gán giá trị), khả năng cao i chứa 1 “giá trị rác” đẫn đến đệ quy lâu (hoặc vô tận :thinking:). Bạn sai rồi, đệ quy theo n đấy.
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?