Было бы истинным утверждением, что каждая рекурсивная функция должна быть реентерабельной?Reentrancy and recursion
ответ
Совсем нет.
Почему рекурсивная функция не может иметь, например, статические данные? Если он не сможет заблокировать критические разделы?
Рассмотрим:
sem_t mutex;
int calls = 0;
int fib(int n)
{
down(mutex); // lock for critical section - not reentrant per def.
calls++; // global varible - not reentrant per def.
up(mutex);
if (n==1 || n==0)
return 1;
else
return fib(n-1) + fib(n-2);
}
Это не идет, чтобы сказать, что написание рекурсивной и возвратной функции легко, ни что это общая картина, ни то, что рекомендуется в любом случае. Но это возможно.
Почему не должна иметь функцию повторного ввода статических данных? –
Daniel: Это противоречит определению: http://en.wikipedia.org/wiki/Reentrant_%28subroutine%29, если у вас нет другого. –
Эта страница смешна (проверьте страницу обсуждения). Рассмотрим API для доступа к файловой системе - они получают доступ к общим глобальным данным и все же могут быть вызваны одновременно из нескольких потоков/процессов. –
Нет, я помню факториальную функцию, которая работает со статическими (глобальными) переменными. Наличие статических (глобальных) переменных противоречит реентерабельной, и все же функция рекурсивна.
global i;
factorial()
{ if i == 0 return 1;
else { i = i -1; return i*factorial();
}
Эта функция рекурсивна и не реентерабельная.
'Reentrant' обычно означает, что функция может вводиться несколько раз одновременно двумя разными потоками.
Чтобы быть реентерабельным, он должен делать что-то вроде защиты/блокировки доступа к статическому состоянию.
Рекурсивная функция (с другой стороны) не требует защиты/блокировки доступа к статическому состоянию, поскольку она выполняет только один оператор за раз.
So: no.
Возможно иметь потокобезопасную, но не возвратную функцию (даже для однопоточного приложения). На самом деле есть пример в http://en.wikipedia.org/wiki/Reentrancy_(computing) – sashoalm
Не совсем. Функция реентера должна иметь возможность обрабатывать одновременное выполнение с разными потоками.
Рекурсивная функция должна иметь возможность обрабатывать запись во время ее работы, но доступ осуществляется контролируемым образом, а не другими потоками.
Если по реентерану вы имеете в виду, что дальнейший вызов функции может начаться до того, как предыдущий закончен, тогда да, все рекурсивные функции оказываются реентерабельными, потому что рекурсия подразумевает возвращение в этом смысле.
Однако «повторный» иногда используется как синоним «потокобезопасный», который вводит множество других требований, и в этом смысле ответ отрицательный. В однопоточной рекурсии мы имеем особый случай, когда только один «экземпляр» функции будет выполняться за раз, потому что «незанятые» экземпляры в стеке ожидают возвращения своего «дочернего» экземпляра.
Реентерабельные и потокобезопасные - это не одно и то же: http://en.wikipedia.org/wiki/Reentrant_(subroutine) –
- 1. Reentrancy and Reentrant in C?
- 2. Racket Iterations and Recursion
- 3. Scala Recursion and Units
- 4. Java Recursion and Returns
- 5. Recursion and Big O
- 6. Threading and Recursion in C#
- 7. quicksort and recursion in python
- 8. Анализ с помощью Happy: left-recursion and right-recursion
- 9. Восемь королей, использующих backtracking and recursion C++
- 10. Django, Celery with Recursion and Twitter API
- 11. Reentrancy in Boost
- 12. Reentrancy был обнаружен
- 13. 'Reentrancy' в java
- 14. Reentrancy in JavaScript
- 15. Reentrancy in async/wait?
- 16. Concise Singleton impl, поддерживающий reentrancy
- 17. , когда pthread_once встречается с reentrancy
- 18. Gui reentrancy с управляемым ожиданием
- 19. hamiltonian Path of Obstructed Grid and Python Recursion Limts
- 20. Jison recursion
- 21. Recursion Logic
- 22. Azure Service Fabric Actors Reentrancy with Services
- 23. Grako left recursion
- 24. SQL Recursion
- 25. java.lang.stackoverflowerror recursion
- 26. Recursion Crash
- 27. Схема recursion
- 28. Matlab recursion
- 29. Quicksort Recursion
- 30. Haskell - Recursion
Помечено как возможно домашнее задание. – ivans
Не домашнее задание, просто вопрос, который у меня был. Не в школе больше; на работе –
Retagged: recrusion => recursion – pakore