LinuxForum.Fans
Тема

Рекурсивный вызов функции

Автор: SkyLine 7 сообщений 3378 просмотров
#340057

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

Пример:

text

#обход графа в глубину
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 }

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

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

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

#340061

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

если это 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.

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

#340063
"SkyLine" написал:
roww=$1

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

#340068

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

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

и вот здесь:

text
else
   echo find $a
   find $a
fi

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

text
0 0 0 0
0 0 0 0
0 0 0 1
1 1 1 0

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

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

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

#340075

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

И да, отладка так включается:
text
set -x
#340076

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

#340105

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

Войдите или зарегистрируйтесь, чтобы ответить.