Рекурсивное нахождение суммы идеальных квадратов в списке

Я пытаюсь рекурсивно найти сумму идеальных квадратов в динамически распределенном списке. По какой-то причине моя функция продолжает пропускать первый элемент.

* 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);?

Другие вопросы по тегам