Я предполагаю, что ваш вопрос не о просмотре вашего кода, а о том, как изменить рекурсивную функцию в стандартной функции.Хвостовая рекурсия обычно проста в управлении, потому что в некотором смысле вам не нужно хранить все результаты, вычисленные во время рекурсии, а просто их накапливать.В вашем случае это еще проще, потому что вам не нужно накапливать результаты.
Вы можете изменить свой код следующим образом:
def sentence_score(sentence_tokens, previous_token, acum_score):
while sentence_tokens:
current_token = sentence_tokens[0]
tags = current_token[2]
token_score = sum([value_of(tag) for tag in tags])
if previous_token is not None:
previous_tags = previous_token[2]
if 'inc' in previous_tags:
token_score *= 2.0
elif 'dec' in previous_tags:
token_score /= 2.0
elif 'inv' in previous_tags:
token_score *= -1.0
sentence_tokens = sentence_tokens[1:]
previous_token = current_token
acum_score = acum_score + token_score
return acum_score
Обновить : Приведенный выше код показывает, как преобразовать исходный код в нерекурсивный код.Как подчеркивает @ chris-hunt, этот код (как и оригинальный) может выполнять копию списка каждый раз, когда мы выполняем назначение sentence_tokens[1:]
.Следовательно, некоторая легкая оптимизация может быть применена к предлагаемому решению для оптимизации кода.В частности, я думаю, что следующее - это лучшее, чего мы можем достичь, не зная подробностей используемых вами структур данных.
def sentence_score(sentence_tokens, previous_token, acum_score):
for current_token in sentence_tokens:
tags = current_token[2]
token_score = sum([value_of(tag) for tag in tags])
if previous_token is not None:
previous_tags = previous_token[2]
if 'inc' in previous_tags:
token_score *= 2.0
elif 'dec' in previous_tags:
token_score /= 2.0
elif 'inv' in previous_tags:
token_score *= -1.0
previous_token = current_token
acum_score = acum_score + token_score
return acum_score