Рекурсивное нахождение суммы идеальных квадратов в списке
Я пытаюсь рекурсивно найти сумму идеальных квадратов в динамически распределенном списке. По какой-то причине моя функция продолжает пропускать первый элемент.
* 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 ответа
Для начала, как массив указал 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
Первый элемент в массиве A[0]
, Ты возвращаешься 0
а не ценность A[0]
когда ты звонишь sum(A,0)
,
Вы пытались изменить строку на: if (n<=0) return A(0);
?