Рекурсия с одномерным массивом

307
24 января 2017, 23:02

Моя функция:

int podchcnt(int arr[])
{
    int res;
    for (int j=1;j<=n;j++)
    {
        if (arr[j]==1)
        {
            res+=1;
            res+=podchcnt(arr[j]);
        }
    }
    return res;
}

Компилятор выдает ошибку:

invalid conversion from 'int' to 'int*' [-fpermissive]

Почему? Я целочисленной переменной присваиваю целочисленное значение функции. В аргументах у функции указан одномерный массив, в рекурсивном вызове передаю одномерный массив.

Полный код: http://pastebin.com/xW8sQiXC. Задан орграф таблицей смежности. Программа должна выдавать количество потомков каждой вершины начиная с первой.

Answer 1

Я, конечно, не специалист в C++, но по-моему вы здесь res+=podchcnt(arr[j]); передаете не массив, а элемент массива (т.е. тип int вместо int[]). Отсюда и ошибка, которая говорит, что нельзя преобразовать int в int[].

Answer 2

Смотрите сами - у вас объявлено

int podchcnt(int arr[])

т.е. что функция podchcnt принимает массив, иначе говоря, указатель на его первый элемент.
А что вы ей передаете в podchcnt(arr[j])?
Просто элемент...

Вот такая вот нестыковка и приводит к проблемам.

Не вдавался в задачу, но могу предположить, что вы хотите передать подмассив, начиная с j-го элемента? Тогда пишите либо arr+j, либо &arr[j].

И еще - напомню, что счет элементов в массиве начинается с нуля, так что вызывает определенные сомнения цикл for (int j=1;j<=n;j++), как, впрочем, и прочие циклы в вашем полном тексте.

Еще - у вас использована неинициализированная переменная res - она не имеет начального значения, в ней может быть, что угодно, так что результат может быть любым :) Инициализируйте ее, объявив как int res = 0;.

Ваша рекурсия вряд ли будет конечной - только если все arr[j] не будут единицами - так как в каждом ее вызове будет выполняться один и тот же цикл, без конца делающий одни и те же вызовы. При этом, поскольку вы будете передавать все меньшие участки массива, будет выход за границы массива со всеми (неприятными) последствиями...

Ну и еще - в данном случае это не ошибка, просто получается не совсем... даже слова не подберу. Не совсем красиво, что ли - передавать массив как параметр, а его размер - как глобальную переменную. Передавайте уж оба значения как параметры - тогда функция окажется куда универсальнее. Для рекурсии это тоже важно.

Answer 3

Судя по всему должно быть так:

res+=podchcnt(arr + j); 

Так как функция принимает массив (считай указатель), то и передавать надо указатель, а не целое число.

Правда, в данном случае надо не забывать, что из-за рекурсии цикл по остаточной части уже должен быть меньше. Правильнее передавать длину (глобальная n) вместе с указателем в функцию. Но это уже совсем другая история.

READ ALSO
Проблема с использованием SRWLOCK в MFC проекте [требует правки]

Проблема с использованием SRWLOCK в MFC проекте [требует правки]

Здравствуйте, прошу подсказкиРаботал с длл с абстрактным интерфейсом, содержащей набор функций для моего приложения

340
Как изменить действие при ON UPDATE/ON DELETE?

Как изменить действие при ON UPDATE/ON DELETE?

Как изменить действие при ON UPDATE/ON DELETE в MySQL? Вот как выглядит таблица сейчас:

293
Текстовый квест [требует правки]

Текстовый квест [требует правки]

Добрый день, хочу сделать простенький текстовый квест, я как понимаю там лучше использовать listview, как в нем сделать чтобы новый textview появлялся...

318
Недостижимый код в Java

Недостижимый код в Java

Недостижимый код в Java считается ошибкой

325