1

Добрый день.
Пытаюсь обратиться из функции к самой же функции(рекурсивно).

Пример:

#обход графа в глубину
function find {
        roww=$1
        was[$roww]=1 #массив пройденых вершин, отмечаем вершину как пройденую

        for((a=0; a<$cols; a++)) #для каждой вершины графа цикл
                do
                        index=$((roww*cols+a)) #индекс элемента массива матрицы смежности
                        if [[ ${arr[$index]} -ge 1 ]] #если есть переход на другую вершину
                                then
                                        if [[ ${was[$a]} -ge 1 ]] #если она уже была пройедна, то цикл
                                                then
                                                        echo circle ${arr[$index]}
                                                        continue
                                                else
                                                        find $a #если не пройдена, то повторяем проход для найденой вершины
                                                fi
                                fi
                done 
}

Вызываю функцию из цикла:

for((b=0; b<$cols; b++))
        do
                nullm #функция зануления массива was, зануляется для каждой вершины
                find $b #вызов функции
        done

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

2

вы хоть ЯП пишите.

если это bash, то для вас локальные переменные нужны.

Variables local to the function may be declared with  the  local  builtin  command.
       Ordinarily,  variables  and  their  values  are shared between the function and its
       caller.

ну и не забудьте массивы объявить. А то некрасиво.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

3

SkyLine пишет:

roww=$1

угу. Вот эта переменная на самом деле глобальная. Т.е. рекурсивный вызов её портит.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

4

Да, пишу на bash.
Обьявил как локальную переменну и поставил вывод:

local roww=$1
was[$roww]=1
echo row $roww

и вот здесь:

else
   echo find $a
   find $a
fi

Теперь для матрицы вида:

0 0 0 0
0 0 0 0
0 0 0 1
1 1 1 0

Вывод такой(нумерация элементов с нуля):

row 0
row 1
row 2
find 3
row 3
find 0
row 0
row 3
find 0
row 0

Т.е. получается что функция переключается на первую строку (row 3, find 0). Что снова с ней не так?

5

SkyLine пишет:

Что снова с ней не так?

не знаю. А почему index глобальный? Делайте уж всё локальным, и всё объявляйте.

И да, отладка так включается:

set -x
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

6

ещё $a тоже глобальная. А индекс вроде не в контексте.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

7

drBatty, премного благодарен за помощь. Получилось. Буду тестить.