【问题标题】:Recursively finding a sum of perfect squares in a list递归查找列表中的完美平方和
【发布时间】:2018-09-01 00:50:54
【问题描述】:

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

*A 是指向数组第一个元素的指针。 n 是元素的数量,表示它们的范围是 0 到 n-1。当 n 小于或等于 0 时,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);
}

【问题讨论】:

  • 显示一个调用这个函数的例子,它给出了错误的结果。

标签: c recursion perfect-square


【解决方案1】:

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

C 中对象的大小是使用size_t 类型估计的。所以第二个参数应该声明为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

【讨论】:

  • 我没有考虑到这一点。在这个函数中它并不重要,但如果我应该打印完美的正方形,那么是的,0 将是一个错误!并感谢您提供更好的解决方案。
【解决方案2】:

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

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

【讨论】:

  • 它不起作用,因为它只是将第一个元素与其他所有元素相加,即使它可能不是一个完美的正方形(现在尝试了)。我试图将条件从 (n
猜你喜欢
  • 2021-02-17
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
相关资源
最近更新 更多