我试图递归地在动态分配的列表中找到一个完美平方和。出于某种原因,我的函数总是忽略第一个元素。
*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);
}
最佳答案
对于初学者来说,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