Расположение переменных в рекурсии

#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)