Подсчет общего количества элементов в списке с помощью рекурсии - PullRequest
1 голос
/ 29 мая 2020

Проблема:

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

Я написал следующую функцию:


def count_rec(arr, i):
    """
        This function takes List (arr) and Index Number
        then returns the count of number of elements in it 
        using Recursion.
    """
    try:
        temp = arr[i]  # if element exists at i, continue
        return 1 + count_rec(arr, i+1)
    except IndexError:
        # if index error, that means, i == length of list
        return 0

Я заметил некоторые проблемы с ним:

  1. RecursionError (когда количество элементов больше 990)
  2. Использование элемента temp (трата память ..?)
  3. Exception Обработка (я чувствую, что мы не должны использовать ее без необходимости)

Если кто-нибудь может подсказать, как улучшить приведенное выше решение или придумайте альтернативу , это было бы действительно полезно.

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Для этого вы можете использовать pop ().

def count_r(l):
    if l==[]:
        return 0
    else:
        l.pop()
        return count_r(l)+1
1 голос
/ 29 мая 2020

То, что у вас есть, вероятно, столь же эффективно, как вы собираетесь получить для этого мысленного эксперимента (очевидно, python уже вычисляет и сохраняет длину для объектов LIST, которые можно получить с помощью встроенной функции len (), поэтому функция совершенно не нужна).

Вы можете получить более короткий код, если хотите:

def count(L):
    return count(L[:-1])+1 if L else 0

Но вам все равно нужно изменить предел рекурсии python.

import sys; sys.setrecursionlimit(100000)

Однако следует отметить, что в большинстве случаев для обработки операторов «if else» требуется больше времени, чем для «try except». Следовательно, «попробовать, кроме» будет лучше (если вам нужна производительность). Конечно, это странно говорить о производительности, потому что рекурсия обычно не работает очень хорошо из-за того, как python управляет пространствами имен и тому подобным. Рекурсия обычно не одобряется, она ненужна и медленна. Итак, попытка оптимизировать производительность рекурсии немного странно.

Последнее замечание. Вы упоминаете, что temp = arr [i] занимает память. Да, возможно, несколько байтов. Конечно, любое вычисление, которое вы выполняете, чтобы определить, имеет ли arr элемент в i, займет несколько байтов в памяти даже при простом запуске arr [i] без присваивания. Кроме того, эти байты освобождаются, когда временная переменная выпадает из области видимости, используется повторно или функция завершается. Следовательно, если вы не планируете запускать 10 000 000 000 подпроцессов, будьте уверены, что при использовании такой временной переменной не произойдет снижения производительности.

1 голос
/ 29 мая 2020

вы, наверное, ищете что-то вроде этого

def count_rec(arr):
    if arr == []:
        return 0
    return count_rec(arr[1:]) + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...