#python #variables #recursion
#python #переменные #рекурсия
Вопрос:
Проблема в том, что мой код продолжает отражать переменную как ноль, и это вызвано тем фактом, что переменная присваивается в начале моей функции, поэтому каждый раз, когда я вызываю функцию, значение равно нулю. Однако мне нужно присвоение этой переменной для работы кода, и ее размещение в операторах elif по-прежнему равно нулю, а размещение переменной вне функции приводит к тому, что функция не работает.
Целью программы является подсчет пар последовательных букв в строке с использованием рекурсии без циклов for / while в коде.
def countpairs(s):
pairs=0
if len(s)<2:
return 0 #base case
elif s[0].lower() == s[1].lower(): #recursion
pairs= 1
return countpairs(s[1:])
else: #recursion
pairs= 0
return countpairs(s[1:])
print(countpairs('Hello Salaam'))
Предполагается, что этот код будет равен 2 из-за «ll» и «aa».
Комментарии:
1. Какова именно цель
pairs
переменной здесь? Вы всегда устанавливаете для нее значение 1 или 0 (и оно также никогда не возвращается из функции)2. Вы хотите
=
, а не=
. Я не знаю, ваша ли это проблема, но это приведет к неправильному поведению. Кроме того,pairs = 0
он ничего не делает и должен быть удален.3. И ya,
pairs
является локальным для каждого рекурсивного вызова. Вам нужно переосмыслить, как вы подходите к этому. Вам нужно будет сделать что-то вроде... elif s[0].lower() == s[1].lower(): return countpairs(s[1:]) 1 else: return countpairs(s[1:])
; хотя это можно очистить. Возвращайте измененное значение; не пытайтесь использовать какое-либо состояние (pairs
), которое вы изменяете при каждом вызове. Это полезно в некоторых случаях, но не здесь.4. @UnholySheep переменная pairs — это переменная, которая будет хранить количество пар последовательных букв, найденных в строке.
5. Это задание явно хочет научить вас функциональному программированию, что означает, что ваша функция не должна выполнять какое-либо сохранение состояния. В функциональном программировании ваши функции являются «чистыми», что означает, что они ничего не изменяют за пределами функции и возвращают только значение
Ответ №1:
Вам нужно немного обдумать, что будет делать рекурсия: она будет вызывать функцию рекурсивно для подсчета пар с этого момента, затем (она должна) добавить пару, если таковая имеется, найденную этим экземпляром.
Таким образом, ваша функция должна что-то делать с результатом рекурсивного вызова, а не просто возвращать его без изменений. Например, вместо этого
elif s[0].lower() == s[1].lower():
pairs = 1
return countpairs(s[1:])
вы могли бы написать это:
elif s[0].lower() == s[1].lower():
return countpairs(s[1:]) 1
Что-то в этом роде. Вам нужно будет немного поработать, чтобы все было правильно, но я надеюсь, что вы поняли идею.
Ответ №2:
Проблема в том, что пары переменных сбрасывают каждый рекурсивный вызов… При использовании рекурсивных алгоритмов подсчета вам не нужна переменная, которая считается, в этом вся прелесть, попробуйте подумать, как рекурсивный вызов может помочь вам подсчитать.
def countpairs(s):
if len(s)<2:
return 0
elif s[0].lower() == s[1].lower():
return countpairs(s[1:]) 1
else:
return countpairs(s[1:])
print(countpairs('Hello Salaam'))
Итак, при рекурсивном вызове «счетчик» становится больше каждый раз, когда он должен быть, думайте о счетчике как о части стека функций (или что-то в этом роде).
Комментарии:
1. извините за макет ответа
2. @ggorlen Спасибо! пожалуйста, проголосуйте за хороший ответ, это мой первый 🙂
Ответ №3:
Вам нужно исправить синтаксис: pairs= 1
должно быть pairs =1
, то же самое для pairs= 0
. И вы можете передать общее количество на следующий уровень.
def countpairs(s, pairs=0):
if len(s)<2:
return pairs #base case
elif s[0].lower() == s[1].lower(): #recursion
pairs =1
return countpairs(s[1:], pairs)
else: #recursion
pairs =0
return countpairs(s[1:], pairs)
print(countpairs('Hello Salaam')) # 2
Ответ №4:
Вы можете сделать это, создав рекурсивную вложенную функцию и определив pairs
во внешней функции. Вот что я имею в виду (с исправлениями для других возникших проблем):
def countpairs(s):
pairs = 0
def _countpairs(s):
nonlocal pairs # Since it's not local nor global.
if len(s) < 2: # base case
return pairs
elif s[0].lower() == s[1].lower():
pairs = 1
return _countpairs(s[1:]) # recursion
else:
return _countpairs(s[1:]) # recursion
return _countpairs(s)
print(countpairs('Hello Salaam')) # -> 2
Ответ №5:
Код всегда будет равен нулю, потому что последняя рекурсия всегда будет иметь длину s, меньшую 2. Вместо этого используйте ключевое слово global, чтобы иметь возможность получать значения пар.
numberOfPairs = 0
pairsList = []
def countpairs(s):
global numberOfPairs
if len(s)<2:
print("doing nothing")
return 0 #base case
elif s[0].lower() == s[1].lower(): #recursion
numberOfPairs =1
newString = f"{s[0]} is equal to {s[1]}"
print(newString)
pairsList.append(newString)
return countpairs(s[1:])
else:
print(f"nothing happened: {s[0]}") #recursion
return countpairs(s[1:])
print(f"nThe returned value of countpairs is: {countpairs('Hello Salaam')}")
print(f"Number of pairs: {numberOfPairs}")
print(pairsList)