【问题标题】:Recursive Function returning 0 in C递归函数在C中返回0
【发布时间】:2018-07-15 19:12:42
【问题描述】:

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

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

这是一种递归方法,在给定输入的情况下,它最终应该返回对输出的估计值。

值 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 都相等。

我还创建了一个函数,该函数在给定开始和结束索引的情况下获取数组的一部分,并作为另一个二维数组返回。这是为了辅助插值功能。

如下图:

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

感谢您的帮助。

【问题讨论】:

  • 您对所有内容都使用整数,因此您的结果可能被四舍五入到 0

标签: c arrays algorithm recursion interpolation


【解决方案1】:

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

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));
}

【讨论】:

    【解决方案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 作为分子,但由于函数返回int,您仍然会得到转换为该类型的答案,这可能不是您想要的。尝试声明函数,使其返回浮点类型。

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 2023-03-14
      • 2017-05-14
      • 2017-10-29
      • 1970-01-01
      • 2017-03-24
      • 2018-01-02
      • 2022-07-21
      • 2018-11-13
      相关资源
      最近更新 更多