Сложение результата после каждого вызова рекурсивной функции
Функция возвращает количество совпавших слов по типу игры в слова. Как сделать так, чтобы переменная 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 шт):
1 способ. Вынести переменную count за пределы функции, тогда она будет глобальной по отношению к телу и при новом вызове функции не будет обнуляться (соответственно убери в теле функции строку count = 0;
2 способ. Передавай в функцию не только строку, но и некоторый флаг "first_call": string_concatenation(line, first_call). Если он равен true, то есть это первый вызов, то обнули count, и тут-же присвой переменной first_call значение false. При следующем рекурентном вызове функции переменная count обнуляться не будет уже.
В Питоне нельзя передать переменную статического типа по ссылке, но можно использовать паллиативное решение: список из одного элемента, так как коллекции, напротив, передаются только по ссылке.
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)Так же можно получить и замкнутое рекурсивное решение. Проблема в том, что при нахождении первой пары у нас количество слов не 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))Кроме того, вы считали не количество слов, а их суммарную длину
Не нужно в функцию засовывать все возможные действия. Она у вас считает количество слов - пусть и считает. А все остальное нужно сделать с возвращаемым значением. Например так:
result=string_concatenation2(s) if result>0: print('Слов= ', result) else: print('Нет совпадающих слов')