Почему эта рекурсивная функция не обрабатывает весь список? - PullRequest
1 голос
/ 22 февраля 2020

Может кто-нибудь сказать мне, что не так с кодом, который я пишу? Я пытаюсь найти сумму всех элементов в этом списке. Мой код:

def determine_sum(m_list, sum_count): 

    for i in range(len(m_list)): 

        if isinstance(m_list[i], int):      
            sum_count += m_list[i]  


        else:  
            return determine_sum(m_list[i], sum_count)

    return sum_count 

m_list = [1, 2, 3, [4, 5], [4, [3,4]] ]

print(determine_sum(m_list, 0))

Вывод 15, но я ожидал 26.

Ответы [ 3 ]

2 голосов
/ 22 февраля 2020
def determine_sum(m_list, sum_count): 

    for i in range(len(m_list)): 

        if isinstance(m_list[i], int):      
            sum_count += m_list[i]  

        else:
            # Don't return here, just add the count and keep looping
            sum_count = determine_sum(m_list[i], sum_count)

    return sum_count 

1 голос
/ 22 февраля 2020

Получение суммы примера списка: 26

Вам не хватало, чтобы добавить выходные данные вложенного define_sum в sum_count.

def determine_sum(m_list, sum_count): 

    for i in range(len(m_list)): 
        if isinstance(m_list[i], int):      
            print(m_list[i])
            sum_count += m_list[i]  
        else:  
            sum_count = determine_sum(m_list[i], sum_count)
    return sum_count 

m_list = [1, 2, 3, [4, 5], [4, [3,4]] ]

print("Sum:", determine_sum(m_list, 0)) # 26
0 голосов
/ 22 февраля 2020

Основная проблема с вашим кодом заключается в следующей строке:

return determine_sum(m_list[i], sum_count)

Если вы сталкиваетесь с другим списком, вы вызываете determine_sum рекурсивно, который вычисляет сумму подсписка и начинается с подсчета sum_count. Однако, каким бы ни был результат для первого подсписка, это общий результат, который вы возвращаете. Ваша функция игнорирует любые следующие списки, потому что return завершает функцию.

Такая рекурсивная функция не должна передавать sum_count. Вместо этого вы можете просто рекурсивно вычислить сумму подсписка, а затем добавить результат к текущей сумме, продолжая l oop. Каждый вызов determine_sum получит свою собственную копию текущей суммы, поэтому вам не нужно ее передавать.

Примерно так:

def determine_sum(m_list): 
    sum_count = 0

    for i in range(len(m_list)): 
        if isinstance(m_list[i], int):      
            sum_count += m_list[i]  
        else:  
            sum_count += determine_sum(m_list[i])

    return sum_count 

m_list = [1, 2, 3, [4, 5], [4, [3,4]] ]

print(determine_sum(m_list))

Итак, вы не были удаленно.

Примечание: некоторые другие предлагаемые решения сохраняют параметр sum_count и изменяют строку проблемной c на:

            sum_count = determine_sum(m_list[i], sum_count)

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

...