Вопрос об использовании возвращаемого значения в python

#python

Вопрос:

 def multiples(n, i=1):
    if i != 11:
        multiples(n,i 1)
    return n*i

print(multiples(2))

output:
2
 

Вот простой пример,

Я хочу, чтобы были напечатаны все кратные (от 2 до 22), чтобы я мог использовать их в другой функции.

Может ли кто-нибудь объяснить мне, почему он печатает только 2?

Комментарии:

1. Попробуйте сначала объяснить мне, почему вы думаете, что на нем должно быть напечатано что-то еще. Если бы вместо рекурсивного вызова multiples он вызвал другую функцию, ожидали бы вы , что результат этой функции будет напечатан? Как и почему? Если нет, то почему он должен работать по-другому для рекурсивного вызова?

2. return multiples(n,i 1)

3. @КлаусД. Это все равно не напечатало бы все кратные числа.

4. Но это первая проблема, которую нужно решить. Если у вас есть дополнительные советы, пожалуйста, добавьте их!

5. Я не понимаю, что вы хотите, чтобы код делал. Ваш простой пример не показывает, что вы ожидаете i сделать. Вы получаете значение 2, потому что: (1) for цикл выполняет 10 рекурсивных вызовов multiples ; (2) вызывающий код затем отбрасывает значения, возвращаемые этими вызовами; поэтому (3) for цикл не имеет эффекта; и (4) единственная эффективная строка кода return n*i ; которая (5) просто возвращает переданное значение.

Ответ №1:

Давайте сначала посмотрим, что делает ваша функция с 1 по 11.

Для multiples(2) параметра функции n=2 , i=1, и найти, что i не равно 11, что удовлетворяет условию, поэтому вызов функции multiples(2, 2)

Далее multiples(2, 2) , значение i=2 все еще не равно 11, поэтому вызов функции multiples(2, 3) и так далее , пока i = 11.

Когда multiples(2, 11) будет вызван. условие не выполнено. Таким образом, функция немедленно возвращает 2 * 11 = 22 и возвращается к multiples(2, 10)

Но после multiples(2, 11) этого возвращаемое значение отбрасывается , и функция multiples(2, 10) возвращает 20

Таким образом, после всей рекурсивности функция multiples(2) вернет только 2 и не получит возвращаемое значение multiples(2, 2)

Если вы хотите напечатать все значение рекурсивного. Я предлагаю вам воспользоваться приведенным ниже методом:

 def multiples(n, i=1):
    if i >= 11:   # it is suggested to use greater then to prevent decimal numbers error
        return [n*i]  multiples(n,i 1)   # add current value and next recursive value
    else:
        return [n*i]   # if i is greater then 11, return value and stop recursive  
        
print(multiples(2))
 

выход:

 [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
 

Ответ №2:

Ваш код не использует возвращаемое значение рекурсивного вызова, и поэтому он возвращает только значение, возвращенное return n*i на первом уровне.

Поскольку вы хотите создать последовательность чисел, лучше всего вместо этого сделать вашу функцию генератором, выдав произведение n и ток i , а затем выдав последовательность из рекурсивного вызова, пока i не достигнет желаемого максимума m :

 def multiples(n, i=1, m=11):
    yield n * i
    if i < m:
        yield from multiples(n, i   1, m)

for i in multiples(2):
    print(i)
 

Это выводит:

 2
4
6
8
10
12
14
16
18
20
22
 

Ответ №3:

Я не уверен, как это будет реализовано с помощью рекурсии или почему рекурсия необходима здесь, в вашем коде, но если вы просто хотите получить кратные числа, то это сработает:

 def multiples(n, i=1):
        while i != 12:
            print(n*i)
            i  = 1

multiples(2)
 

Я бы посоветовал вам изучить основы рекурсии, вызова функций и т.д.