递归地找到列表中的完美平方和
Recursively finding a sum of perfect squares in a list
我正在尝试以递归方式在动态分配的列表中找到完全平方和。 由于某种原因,我的函数一直忽略第一个元素。
*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);
}
数组中的第一个元素是 A[0]
。当您调用 sum(A,0)
.
时,您将返回 0
而不是 A[0]
的值
您是否尝试将行更改为:if (n<=0) return A(0);
?
对于初学者来说,由于 A
指向的数组没有改变,指针应该用限定符 const
.
声明
C 中对象的大小是使用类型 size_t
估算的。所以第二个参数应该声明为 size_t
.
类型
此外,完全平方和可以大于 int
类型的对象所能容纳的大小。所以最好使用类型long long int
作为return类型。
如果我没记错的话,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
我正在尝试以递归方式在动态分配的列表中找到完全平方和。 由于某种原因,我的函数一直忽略第一个元素。
*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);
}
数组中的第一个元素是 A[0]
。当您调用 sum(A,0)
.
0
而不是 A[0]
的值
您是否尝试将行更改为:if (n<=0) return A(0);
?
对于初学者来说,由于 A
指向的数组没有改变,指针应该用限定符 const
.
C 中对象的大小是使用类型 size_t
估算的。所以第二个参数应该声明为 size_t
.
此外,完全平方和可以大于 int
类型的对象所能容纳的大小。所以最好使用类型long long int
作为return类型。
如果我没记错的话,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