Сложение результата после каждого вызова рекурсивной функции

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

def string_concatenation(line):
    global count
    count = 0

    if len(line) == 0:
        print("Cтрока пуста")
        return

    words = line.split()
    if words[0][-1] == words[1][0:1]:
        count = count + len(words[0]+words[1])
        print(count)
        words.remove(words[0])
        new_line = ' '.join(words)
        string_concatenation(new_line)
    else:
        print("Нету совпадения")
        return

s = "Собака азот томат теплоход дача арбуз забота такси"
string_concatenation(s)



Ответы (2 шт):

Автор решения: Dmitry Safonov

1 способ. Вынести переменную count за пределы функции, тогда она будет глобальной по отношению к телу и при новом вызове функции не будет обнуляться (соответственно убери в теле функции строку count = 0;

2 способ. Передавай в функцию не только строку, но и некоторый флаг "first_call": string_concatenation(line, first_call). Если он равен true, то есть это первый вызов, то обнули count, и тут-же присвой переменной first_call значение false. При следующем рекурентном вызове функции переменная count обнуляться не будет уже.

→ Ссылка
Автор решения: becouse
  1. В Питоне нельзя передать переменную статического типа по ссылке, но можно использовать паллиативное решение: список из одного элемента, так как коллекции, напротив, передаются только по ссылке.

    def string_concatenation(line, count):
        if len(line) > 0:
            words = line.split()
            if len(words)>1:
                if words[0][-1] == words[1][0:1]:
                    count[0] = count[0] + 1
                words.remove(words[0])
                new_line = ' '.join(words)
                string_concatenation(new_line, count)
            else:
                if count[0]>0:
                    count[0] = count[0] + 1
    
         s = "Собака азот томат теплоход дача арбуз забота такси"
         count=[0]
         string_concatenation(s, count)
         print(count)
    
  2. Так же можно получить и замкнутое рекурсивное решение. Проблема в том, что при нахождении первой пары у нас количество слов не 1, а два. Решить ее можно сначала сохранив значение функции в переменную, а потом увеличив его на 1 в нужный момент (хвостовая рекурсия)

    def string_concatenation2(line):
        if len(line) > 0:
            words = line.split()
            if len(words)>1:
                count=0
                if words[0][-1] == words[1][0:1]:
                    count = 1
                words.remove(words[0])
                new_line = ' '.join(words)
                res=string_concatenation2(new_line)+count
                if res==1:
                    res=2
                return res
            else:
                return 0
        else:
            return 0
    
    
        print(string_concatenation2(s))
    
  3. Кроме того, вы считали не количество слов, а их суммарную длину

  4. Не нужно в функцию засовывать все возможные действия. Она у вас считает количество слов - пусть и считает. А все остальное нужно сделать с возвращаемым значением. Например так:

    result=string_concatenation2(s)
    
    if result>0:
         print('Слов= ', result)
    else:
         print('Нет совпадающих слов')
    
→ Ссылка