Viết hàm tính s(n) = 1 + 1/2 + 1/3 + ... + 1/n bằng đệ quy nhưng bị lỗi lặp vô tận

Mình đã thử và kết quả đều trả về = 1 :smiley: Không đúng nhé :slight_smile:

1 Like

bạn phải ép kiểu và trả về float nhé. :blush:
số nguyên n>1 thì cứ 1/n nó sẽ thành 0, nên chỉ có 1/1 nó mới có giá trị là 1. => luôn là 1

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

float fraction(int n);
int main()
{
    int number;
	printf("Type a number: ");
    while ((scanf("%d", &number)) != EOF)
        printf("Result: %.2f\n", fraction(number));
}
float fraction(int n)
{
    if (n == 1)
        return 1;
    return ((float) 1)/n + fraction(n-1);
}

có mấy thư viện không dùng đến mình bỏ đi rồi, chắc bạn dùng trong phần khác.

À, chỗ này có chút lầm, mình sửa thành fraction(1/(n-1)); nhé, nhưng vẫn không chạy được :D?

1 Like

mình giải thích bên trên, bạn hiểu chưa?

À, được rồi, nhưng chưa hiểu lắm.

Bạn có thể giải thích cách hoạt động của lệnh này không? Cho float vào trực tiếp lệnh return cũng dc hả?

1 Like

cái (float) là ép kiểu float, nếu không ép kiểu thì 1/n sẽ trả về kết quả kiểu int do 1 và n đều là int. và do (1/n) là int nên khi chia nó sẽ lấy phần nguyên và bỏ phần thập phân. Vì vậy mình ép kiểu cho 1 thành kiểu float (chỉ cần 1 trong 2 thành phần tham gia phép tính có kiểu float) thì phép tính 1/n sẽ có giá trị mang kiểu float và phần thập phân sẽ được giữ lại.
Do chỉ ép kiểu cho 1 nên mình bọc (float) 1 trong cặp ngoặc…
Bạn chú ý là (float) 1/n với ((float) 1)/n không giống nhau đâu nhé.

không phải, lúc gọi hàm bạn chỉ cần truyền vào mẫu số thôi chứ không cần truyền cả phân số. lúc return nó sẽ tính phân số cho bạn (cái 1/n ấy).

1 Like

À, có cách nào mà kết quả ở dạng phân số không nhỉ? :smiley: Tức là hai phân số cộng lại ra 1 kết qua là phân số thay vì số thập phân ấy?

1 Like

cái này chắc bạn tạo lớp rồi overload operator +

Bạn nói thế thì mình chịu :smiley: Không hiểu 100%

1 Like

:grin: Bạn học OOP chưa?

À, dĩ nhiên là chưa?
Mà lập trình hướng đối tượng có quan trong không nhỉ? Nó nghĩa là gì?

Tất nhiên là quan trọng rồi :smile:

@tucanhminh nếu chưa biết OOP có thể dùng struct in c để thay thế nha :slight_smile:

        struct Fractions
        {
             int numerator, denominator;
        }

        Fractions Add2Fractions(Fractions p1, Fractions p2)
        {
            int T = p1.numerator * p2.denominator + p2.numerator * p1.denominator;
            int M = p1.denominator * p2.denominator;
            Fractions p;
            p.numerator = T;
            p.denominator = M;
            return p;
        }


        Fractions fraction(int n)
        {
            Fractions p1, p2;
            p1.numerator = 1;
            p1.denominator = 1;
            if (n == 1)
                return p1;
            p2.numerator = 1;
            p2.denominator = n;
            return Add2Fractions(p2, fraction(n - 1));
        }
1 Like

Cảm ơn bạn nhe! Mặc dù mình không hiểu hết code của bạn :smiley:

Đầu tiên bạn tạo ra một struct Phân số với 2 thuộc tính tử và mẫu. Sau đó viết hàm cộng hai phân số với tham số truyển vào là 2 struct. Còn hàm đệ quy thì tương tự thôi. chek tại code c# nên hơi khó đọc
Bạn có thể tham khảo cách sử dụng struct ở đây or search struct in c là hiểu ngay :grin:
http://www.tutorialspoint.com/cprogramming/c_structures.htm

1 Like

Khà khà, sau gần nửa năm mài miệt luyện công cực khổ, cuối cùng ta cũng đã hiểu struct và áp dụng cho bài này :grin:

bài này cần gì struct nhỉ? (chưa học nên chả biết struct là cái gì cơ mà mình thì không cần nó).

#include <stdio.h>

double tong(int n) {
    if (n <= 1) return 1;
    return (double) 1/n + tong(n - 1);
}

int main() {
    /* whatever you put here, it will be run. */
}

Kết quả xuất ra dưới dạng phân số chứ không phải số thập phân.

Hiểu rồi nhé anh Béo :joy: Dùng struct + operator

2 Likes

ha ha, mình cũng ít dùng struct nên hồi đó không nhớ ra là có struct cũng làm đc :smiley:

3 Likes
#include<stdio.h>
   double S(int n){
   	if(n==0)
   	return 0 ;
   	else return S(n-1)+(1.0/n);
   } 

em gặp lỗi y như bác, nhờ lời giải ở dưới mà em tính đc nên phải tạo acc vào đây để like

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