1

我试图在动态分配的列表中递归地找到完美平方的总和。出于某种原因,我的函数一直忽略第一个元素。

*A 是指向数组第一个元素的指针。n 是元素的数量,表示它们的范围是 0 到 n-1。当 n 小于或等于零时, n-1 不是有效索引,因此我将 0 返回到完美平方和。

int sum(int *A, int n)
{
    int i, num = 0;

    if (n <= 0)
        return num;

    for (i = 0; i < A[n - 1]; i++) {
        if (i*i == A[n - 1]) {
            num = A[n - 1];
        }
    }
    return num + sum(A, n - 1);
}

为什么第一个元素总是被忽略?它适用于列表中的所有其他元素。

编辑:我尝试再次调用该函数,似乎只有数字 1 被忽略了。通过修改 for 循环条件已解决此问题,因此解决方案是:

int sum(int *A, int n)
{
    int i, num = 0;

    if (n <= 0)
        return num;

    for (i = 0; i <= A[n - 1]; i++) {
        if (i*i == A[n - 1]) {
            num = A[n - 1];
        }
    }
    return num + sum(A, n - 1);
}
4

2 回答 2

2

对于初学者来说,指向的数组A没有改变,指针应该用 qualifier 声明const

C 中对象的大小是通过使用 type 来估计的size_t。所以第二个参数应该声明为具有 type size_t

此外,完全平方和可以大于该类型的对象int可以容纳的对象。所以最好使用类型long long int作为返回类型。

如果我没记错的话 0 不是一个完美的正方形。虽然它不是很重要,但循环可以从 1 而不是 0 开始。

我可以建议以下解决方案。

#include <stdio.h>

long long int sum( const int *a, size_t n )
{
    int perfect_square = 0;

    if ( n )
    {
        int i = 1;

        while ( i * i < a[n-1] ) i++;

        if ( a[n-1] == i * i ) perfect_square = a[n-1];
    }

    return n == 0 ? perfect_square : perfect_square + sum( a, n -1 );
}


int main(void) 
{
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    const size_t N = sizeof( a ) / sizeof( *a );

    printf( "The sum of perfect squares is %lld\n", sum( a, N ) );

    return 0;
}

程序输出为

The sum of perfect squares is 14
于 2018-03-22T15:02:20.207 回答
1

数组中的第一个元素是A[0]。您正在返回0,而不是A[0]您调用时的值sum(A,0)

您是否尝试将行更改为:if (n<=0) return A(0);

于 2018-03-22T14:27:59.340 回答