我试图以递归方式在动态分配的列表中找到完美正方形的总和。 出于某种原因,我的功能一直在忽略第一个元素。
* 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);
}
为什么第一个元素总是被忽视?它适用于列表中的所有其他元素。
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);
}
答案 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);
?