В Python, как я могу вернуть значение из функции, когда выполняется оператор `if`? - PullRequest
0 голосов
/ 26 апреля 2019

В этой функции я хочу вернуть значение при выполнении оператора if.

Поскольку Python всегда что-то возвращает, он возвращает None.

def Persistence(number, counter):
    numArr = [int(i) for i in str(number)]
    result = 1
    data = None
    for j in numArr:
        result *= j
    if len(str(number)) == 1:
        data = str(f'Done. {counter} steps taken')
        print(data)
        # return data
    else:
        counter = counter + 1
        Persistence(result, counter)
    # return data

print(Persistence(333,0))

Может быть, я поставил ключевое слово return не в том месте (я проверил, поместив его в двух разных местах, помеченных как комментарии) или что-то еще, но я не смог понять это.

Пожалуйста, помогите мне. Также, если есть другой способ подсчета шагов рекурсии, кроме моей техники, пожалуйста, дайте мне знать.

Ответы [ 4 ]

3 голосов
/ 26 апреля 2019

Может быть попробовать это:

def Persistence(number, counter):
    numArr = [int(i) for i in str(number)]
    result = 1

    for j in numArr:
        result *= j
    if len(str(number)) == 1:
        return str(f'Done. {counter} steps taken')

    counter = counter + 1
    return Persistence(result, counter)

print(Persistence(333,0))

Надеюсь, это поможет

1 голос
/ 27 апреля 2019

Этот вопрос лучше узнать о рекурсии, чем вы думаете.Но мы не будем мутить воду, смешивая рекурсию (функциональный стиль) с утверждениями и побочными эффектами (императивный стиль).

Похоже, вы пытаетесь вычислить мультипликативный корень и постоянство.Вместо того, чтобы объединять все вычисления в одну функцию, разбейте ее на разумные части -

def digits (n = 0):
  if n < 10:
    return [ n ]
  else:
    return digits (n // 10) + [ n % 10 ]

def product (n = 0, *more):
  if not more:
    return n
  else:
    return n * product (*more)

def mult_root (n = 0):
  if n < 10:
    return [ n ]
  else:
    return [ n ] + mult_root (product (*digits (n)))

def mult_persistence (n = 0):
  return len (mult_root (n)) - 1

print (mult_persistence (333))
# 3

print (mult_root (333))
# [ 333, 27, 14, 4 ]
1 голос
/ 26 апреля 2019

Ваша логика подсчета шагов рекурсии в основном правильная, вам просто нужно поместить операторы return для обоих: 1) Базовый случай 2) Сам рекурсивный вызов

Следующая модификация вашего кода сделает то, что вы просите:

def Persistence(number, counter):
    numArr = [int(i) for i in str(number)]
    result = 1
    data = None
    for j in numArr:
        result *= j
    if len(str(number)) == 1:
        data = str(counter)
        return data
    else:
        counter = counter + 1
        return Persistence(result, counter)


print(Persistence(333,0))

Приведенный выше код вернет результат:

3

Обратите внимание, что причина, по которой вы получили "None" в качестве вывода в исходном коде, заключается в том, что вы не делали возврат при самом рекурсивном вызове: **return** Persistence(result, counter)

Поэтому, когда вы запустили print(Persistence(333,0)), он ничего не возвращал, что привело к None.

1 голос
/ 26 апреля 2019

Проблема в том, что вы не устанавливаете значение из вызова else в persistence.Следующий код возвращает значение данных для меня:

def Persistence(number, counter):
    numArr = [int(i) for i in str(number)]
    result = 1
    data = None
    for j in numArr:
        result *= j
    if len(str(number)) == 1:
        data = str(f'Done. {counter} steps taken')
        print(data)
        return data
    else:
        counter = counter + 1
        data = Persistence(result, counter)
    return data

x = Persistence(333, 0)

Тогда, если мы напечатаем x:

print(x)
# Done. 3 steps taken
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...