递归函数在C中返回0

时间:2018-02-05 20:24:16

标签: c arrays algorithm recursion interpolation

我正在尝试使用一种名为Neville方法的特定方法来实现一种称为拉格朗日插值的插值方法。

我的问题是函数返回0,我不确定为什么。

这是一种递归方法,最终应根据已插入的数据返回给定输入的输出估计值。

Description

值P_0,1,2,...,n-1,n称为P_1,2,...,n-1,n和P_0,1,2,... n-1。 P_1,2,...,n-1,n称为P_2,...,n-1,n和P_1,2,...,n-1。当它下降到P_0,P_1,...或P_n时,它调用f(x_0),f(x_1),...或f(x_n),它们是预先已知的,因为它是内插数据的一部分。

在我展示递归函数的代码之前,我应该提到插值数据是2d数组,第一列是输入值(x),第二列是输出值(y)。它只是一个随机排序的2d数组,x和y都相等。

我还创建了一个函数,它在给定开始和结束索引的情况下抓取数组的一部分,并返回另一个2d数组。这有助于插值功能。

如下所示:

int **index_array(int **array, int beg, int stop)
{
    int i, **new_array, new_array_length;

    new_array_length = stop - beg + 1;

    new_array = malloc(sizeof(int *) * (new_array_length));

    for (i = 0; i < new_array_length; i++)
    {
        new_array[i] = malloc(sizeof(int)*2);
    }

    for (i = 0; i < new_array_length; i++)
    {
        new_array[i][0] = array[beg + i][0];
        new_array[i][1] = array[beg + i][1];
    }

    return new_array;
}

这是插值函数:

int Lagrange_Neville(int **array, int n, int x)
{

    int i;

    if (n == 1)
    {
        return array[0][1];
    }

    return 1/(array[n-1][0] - array[0][0]) * ((x - array[0][0])*Lagrange_Neville(index_array(array, 1, n-1), n-1, x)-(x-array[n-1][0])*Lagrange_Neville(index_array(array, 0, n-2), n-1, x));
}

我的主要():

int main(void)
{

    srand(time(NULL));

    int **array, **new_array, n, beg, end, x;

    n = 10;
    beg = 5;
    end = n-1;
    x = 5;

    array = createArray(n);

    printf("First array:\n");
    print_array(array, n);

    new_array = index_array(array, beg, end);

    printf("New array from indices %d to %d of the old array:\n", beg, end);
    print_array(new_array, end-beg+1);

    printf("Output of lagrange interpolating estimated at x = %d\n", x);
    printf("%d\n", Lagrange_Neville(array, n, x));

    return 0;
}

我的输出:

First array:
2 2
5 5
7 7
9 9
12 12
13 13
16 16
17 17
20 20
21 21

New array from indices 5 to 9 of the old array:
13 13
16 16
17 17
20 20
21 21

Output of lagrange interpolating estimated at x = 5
0

我感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

零来自函数返回的第一项:

1/(array[n-1][0] - array[0][0])

您使用大于1的数字执行1的整数除法。由于数学结果小于1,并且由于数字的小数部分被截断,因此最终得到0。

你需要在这里做至少一个操作数double来进行浮点运算。您也应该从函数中返回double

double Lagrange_Neville(int **array, int n, int x)
{

    int i;

    if (n == 1)
    {
        return array[0][1];
    }

        //   v---- constant of type double
    return 1.0/(array[n-1][0] - array[0][0]) * ((x - array[0][0])*Lagrange_Neville(index_array(array, 1, n-1), n-1, x)-(x-array[n-1][0])*Lagrange_Neville(index_array(array, 0, n-2), n-1, x));
}

答案 1 :(得分:2)

跳出来的第一件事是你的Lagrange_Neville()函数被声明为返回int,并且你在这里使用整数除法:

  

return 1/(array[n-1][0] - array[0][0]) * ((x - array[0][0])*Lagrange_Neville(index_array(array, 1, n-1), n-1, x)-(x-array[n-1][0])*Lagrange_Neville(index_array(array, 0, n-2), n-1, x));

因为array被声明为包含整数,并且1显然是一个整数,所以你将在第一个除法中获得整数结果,这可能会给出0。你可以改变除法给出float使用1.0作为分子代替1的{​​{1}}结果,但由于该函数返回int,您仍然会得到答案“{1}}转换为那种类型,这可能不是你想要的。尝试声明该函数,以便它返回一个浮点类型。