powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Рекурсия
8 сообщений из 8, страница 1 из 1
Рекурсия
    #33699150
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пришлось создать тему

Эта функция никогда не вернет 13

Как прервать на 4 уровне вложенности функцию и вернуть 13

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
clear
 ?transform((WTF( 1 )))


FUNCTION WTF(x)
  IF x =  5  then
   RETURN  13 
  ENDIF
  
  WTF(x+ 1 )

 RETURN  666 
ENDFUNC
...
Рейтинг: 0 / 0
Рекурсия
    #33699175
Doktor Gradus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно.

Выполните следующий код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
clear
 ?transform((WTF( 1 )))


FUNCTION WTF(x)
  IF x =  5  then
   RETURN  13 
  ENDIF
  ? 'до вызова рекурсии ',x
  WTF(x+ 1 )
  ? 'после вызова рекурсии ',x
 RETURN  666 
ENDFUNC

Изучив результат, делайте выводы и думайте как вам быть дальше.
...
Рейтинг: 0 / 0
Рекурсия
    #33699200
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И что я знаю что происходит с "x"

Я дал этот пример не для выяснения значения "x"

Я спросил как прервать всю цепочку в стеке и вернуть нужное мне значение

почему RETURN не прерывает выполнение всей функции а идет прыгать по ее вызовам?
...
Рейтинг: 0 / 0
Рекурсия
    #33699218
Doktor Gradus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что вам непонятно?

Если х сначала увеличивается, а потом уменьшается обратно, значит в условии if x = 5 надо поставить признак достижения этого значения (ll_Return), а вместо RETURN самой функции IF котрый в зависимости от значения ll_Return(true или false), возвращает 13 или 666.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public ll_Return
ll_Return = .f.

clear
 ?transform((WTF( 1 )))

release ll_Return

FUNCTION WTF(x)
  if x ==  5 
    ll_Return = .t.
    return ll_Return
  endif

  wtf(x+ 1 )
	
  if ll_Return = .t.
    return  13 
  else
    return  666 
  endif

ENDFUNC
...
Рейтинг: 0 / 0
Рекурсия
    #33699219
Doktor Gradus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виноват, переменная ll_Return имеет префикс, конечно не ll (local logical), а gl - global logical
...
Рейтинг: 0 / 0
Рекурсия
    #33699228
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну вот что и требовалось доказать я еще раньше спросил: "что мне вводить глобальную переменную для отслеживания факта достижения условия?"

Но волнует попрежнему другой факт какой механизм есть у фокса для прекращения всей цепочки вызовов почему RETURN этого не делает

Cancel не предлогать
...
Рейтинг: 0 / 0
Рекурсия
    #33699307
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sea.s2почему RETURN не прерывает выполнение всей функции а идет прыгать по ее вызовам?
А почему она должна прервать? Вас ведь не удивляет, что RETURN 666 ничего не прерывает. Почему же команда RETURN данная в другом месте должна что-то там прервать?

Все как и положено. Команда RETURN штатно завершает выполнение текущей процедуры или функции и передает управление на уровень выше.

Если необходимо "перескочить" через несколько уровней, то у команды RETURN есть дополнительные опции. Куда возвращать результат.

В данном случае это выглядит так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
clear
?WTF( 1 )

FUNCTION WTF(x)
IF x =  5  
	RETURN TO MASTER  13 
ENDIF

WTF(x+ 1 )

RETURN  666 
ENDFUNC

Однако, в общем случае, это не годится, поскольку вызвавшая процедура не обязательно главная. Как правило, рекурсия вызывается не сама по себе, а обязательно через дополнительную функцию "вхождения" в рекурсию. Тогда получаем такой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
clear
?InRecurs( 1 )

FUNCTION InRecurs(x)
LOCAL y
y = WTF(x)
RETURN y
ENDFUNC

FUNCTION WTF(x)
IF x =  5  
	RETURN TO InRecurs  13 
ENDIF

WTF(x+ 1 )

RETURN  666 
ENDFUNC

Функция "вхождения" в рекурсию берет на себя функции диспетчера и контроля корректности переданных параметров. А в данном случае, еще и точкой возврата в случае прерывания цепочки рекурсии.
...
Рейтинг: 0 / 0
Рекурсия
    #33699312
Sea.s2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот спасибо Владимир как всегда все разрулил
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Рекурсия
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]