30/09/2018, 16:15

Hàm có tham số nhận vào là một hàm khác

Mình là newbie. Cho mình hỏi, bài này là dùng hàm có tham số là hàm để tính nhiều phương trình cùng lúc. Trong trường hợp này là dành cho các phương trình có điểm chung là có nghiệm duy nhất trên đoạn (a; b).

Tuy nhiên, ở dòng gọi hàm phía dưới, tại sao khi gọi hàm Func1 thì lại không có tham số?

Dòng có làm dấu phía dưới.

    x = Solve(Func1, -1, 0); //Dòng này cần xem, Func không có tham số

Toàn bộ code

double Func1(double x)
{
    return pow(x,5) + 7*x + 1; //Hàm x^5 + 7x +1
}

double Func2(double x)
{
    ....
    //Ttự nhưng với ptr khác
}

double Solve(double F(double x), double a, double b)
{
    double left = a, right = b;

    while(right-left > Epsilon)
    {
        double mid = (left+right)/2;
        if(F(left)*F(mid) < 0) //gọi hàm F trong hàm Solve
            right = mid;
        else
            left = mid;
    }

    return (left+right)/2;
}

void main()
{
    double x;
    x = Solve(Func1, -1, 0); //Dòng này cần xem, Func không có tham số
    cout << x;
    x = Solve(Func2, 2, 0); //Ttự
    ....
}
X viết 18:25 ngày 30/09/2018

vì trong hàm solve đã có x rồi :)))

Đoàn Hiếu Tâm viết 18:25 ngày 30/09/2018

Có đâu bạn, hình như hàm F chỉ nhận giá trị từ hai tham số a và b, chứ không đưa vào giá trị nào liên quan cho hàm Solve nên ko cần tham số? Mình cứ nghĩ gọi hàm mà ko có tham số sẽ bị lỗi?

X viết 18:17 ngày 30/09/2018

trong solve có “double F(double x)”

Nguyễn Minh Dũng viết 18:20 ngày 30/09/2018

Em hiểu cái dòng khai báo sau chỉ là khai báo thôi nhé

double Solve(double F(double x), double a, double b)

Nó có nghĩa là hàm Solve sẽ nhận vào một hàm là hàm F. Thêm nữa, hàm F có cấu trúc như sau

double F(double x)

Chấm dứt.


Khi em gọi hàm Solve ở dưới, thì em đã truyền địa chỉ của hàm Func1 hoặc Func2 vào. Cả hai hàm này thỏa mãn được cái khai báo ở trên. Tức là có cấu trúc tương tự như hàm F là tham số của hàm Solve

double F(double x)

Bên trong hàm Solve ta sẽ gọi lại hàm F. Ở đây, ta thực sự gọi cái địa chỉ của hàm F. Nếu em truyền Func1 vào thì FFunc1. Tương tự với Func2.

Ở đây, em mới bắt đầu truyền tham số vào hàm F, tức là hàm Func1 hoặc Func2

if(F(left)*F(mid) < 0)

Đến thời điểm này thì em mới thực sự truyền x vào cho hàm Func1 hoặc Func2.

Trước đó, em chỉ có được địa chỉ của hàm F mà thôi. Em không cần, chính xác hơn, chưa cần phải truyền X vào. Tại thời điểm đó hàm Solve chỉ cần biết được đâu là địa chỉ của hàm F. Còn tham số gì sẽ truyền vào sau.

Bài liên quan
0