递归函数在C中返回0

Recursive Function returning 0 in C

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

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

这是一种递归方法,最终应该 return 根据其内插的数据估计给定输入的输出。

值 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),这是事先已知的,因为它是插值数据的一部分。

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

我还创建了一个函数,它获取数组的一部分,给定开始和结束索引,returns 作为另一个二维数组。这是为了辅助插值功能。

如下所示:

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

感谢任何帮助。

首先跳出来的是你的 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 结果,但是由于函数 returns int 你仍然会得到一个转换为的答案那种类型,这可能不是你想要的。尝试声明该函数,使其 returns 成为浮点类型。

零来自函数 returns:

中的第一项
1/(array[n-1][0] - array[0][0])

您正在执行 1 除以大于一的数的整数除法。由于数学结果小于 1,并且由于数字的小数部分被截断,所以最终得到 0。

您需要通过使至少一个操作数成为 double 来进行浮点数学计算。您可能也应该 return 一个 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));
}