Обычно не выбирается по одной из двух причин:
- кодер не понимает рекурсию (в частности, хвостовую оптимизацию); и
- это может быть дорого в стеке.
Хотя стандарту нечего сказать о стековом пространстве, он часто является ограниченным ресурсом, склонным к переполнению.
Например, это плохая рекурсивная функция:
def addTwoPositiveNumbers (a,b):
if b == 0:
return a
return addTwoPositiveNumbers (a+1,b-1)
(если он не может выполнить эту оптимизацию хвостовой части). Это потому, что теоретически он может использовать много уровней стека, например, когда b = 1,000,000,000
, он будет использовать миллиард кадров стека.
С другой стороны, двоичный поиск не так уж плох, поскольку он удаляет половину пространства поиска с каждым уровнем рекурсии. Таким образом, даже если у вас есть миллиард записей, это будет только лог 2 1 000 000 000 или 30 уровней стека.
Перечислив причины, по которым, как мне кажется, люди избегают этого, я должен сказать, что я использую его довольно часто, и вы должны понимать, что многие проблемы естественным образом выражаются лучше как рекурсивное решение. Код чище и читабельнее. Только по этой причине он должен быть частью вашего арсенала.