#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)
Я бы посоветовал вам изучить основы рекурсии, вызова функций и т.д.