递归地在列表中找到完美正方形的总和

时间:2018-03-22 14:22:27

标签: c recursion perfect-square

我试图以递归方式在动态分配的列表中找到完美正方形的总和。 出于某种原因,我的功能一直在忽略第一个元素。

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

2 个答案:

答案 0 :(得分:2)

对于初学者,由于A指向的数组未更改,因此应使用限定符const声明指针。

使用类型size_t估算C中对象的大小。因此,第二个参数应声明为类型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

答案 1 :(得分:1)

数组中的第一个元素是A[0]。当您拨打0时,您将返回A[0]而不是sum(A,0)的值。

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