Estoy tratando de impararar una función recursiva con python
с точки зрения конечных результатов делопроизводства в целом
Tengo el siguiente código:
def sumaDivisores(n):
n = abs(n)
if n == 1: #Caso Base
return 1
if n > 1: #Caso recursivo
suma = n + sumaDivisores(n%(n-1))
return suma
print(sumaDivisores(2))
Sin duda, estoy haciendo mal la llamada recursiva, pero no se me mecurre la forma correcta de hacerlo.
То, что пришло в голову мне, слегка mГЎs сложно, что то, что ты пробовал tГє. Я подозреваю, что должна быть форма mГЎs простая. В любом случае, я объясняю тебе, что quГ© tenГ-схвати зло и я lГ-nea размышления.
Перекурсивное размышление на делителях одного nГєmero serГ - в:
n
должен быть часть суммы. d
, которые разделяли бы n
тогда, мы можем оставлять себе частное c = d//n
(//
- та divisiГіn целая в python3). Сумма, что мы ищем serГЎ n
mГЎs сумма делителей c
. Она recursiГіn следовательно в этом случае не снижается "один за другим". У n-1
нет из-за quГ© быть делителем n
(в самом деле не это serГЎ кроме для n=2
).
С другой стороны tГє то, что ты перемещал recursivamente, было оставшаяся часть ее divisiГіn (оператор %
) то, что также не имеет много чувства. Осуществляя в python то, что раньше я сказал о слове, у меня остается
asГ-:
def sumaDivisores(n):
# Caso base que se resuelve directamente
if n==1:
return 1
# Cualquier otro caso, hay que recorrer todos los números entre 2 y n
# (ambos inclusive) buscando divisores
for i in range(2,n+1):
if n%i == 0: # Tenemos un divisor
# Aplicamos recursividad
return n + sumaDivisores(n//i)
Эта implementaciГіn функционирует правильно в различные случаи, которые я протестировал, но есть у чего-то "грязно", что только что не убедил меня, связанный с формой, в которой должны относиться друг к другу случаи 1
и n
. Также не является очень работоспособным искать делители между 2 и n, итак, если ты прибываешь в в€ љn, не находя ни одного, уже ты не будешь находить. Но если мы не остаемся до n
, не encontrarГЎ сам n
, с которым не harГ - в нее divisiГіn n//n
, чтобы находить 1.
def sumaDivisores(n):
def encontrarDivisores(m):
if m > 0:
if n%m == 0:
arr.append(m)
encontrarDivisores(m-1)
arr = []
encontrarDivisores(n)
print("El número %d, tiene %s divisores; Suman %d." % (n, arr, sum(arr)))
sumaDivisores(0)
sumaDivisores(11)
sumaDivisores(17)
sumaDivisores(23)
sumaDivisores(12)
sumaDivisores(18)
sumaDivisores(24)
Эта проблема решена очень fГЎcilmente формы iterativa, но, ввиду того, что estГЎs, прося делать это перекурсивной формой, acГЎ я оставляю тебе две версии. Она explicaciГіn каждой estГЎ внизу.
def sumaDivisores(n):
n = abs(n)
def _sumarDivisores(div_actual):
if div_actual == 0:
return 0
s = _sumarDivisores(div_actual - 1)
if n % div_actual == 0:
return s + div_actual
return s
return _sumarDivisores(n)
print(sumaDivisores(10)) # 18
Восток - та versiГіn перекурсивная, та, в которой ты нуждаешься. Хотя ответ JackNavaRow правилен, мне кажется, что он, vГ-эксперт состоит mГЎs просто и fГЎcil в том, чтобы понимать. Она funciГіn приходящая ученица sumaDivisores
имеет как Гєnico цель считать mГіdulo nГєmero в cuestiГіn. Тяжелая работа делает она funciГіn внутренняя _sumaDivisores
, которые реализуют два задания основательно:
estГЎ, что базовый случай, - когда настоящий делитель - 0
, в случае которых возвращают 0
, как он суммирует.
ClГЎsica
def sumaDivisores(n):
suma = 0
for i in range(1, n + 1):
if n % i == 0:
suma += i
return suma
print(sumaDivisores(10)) # 18
Con генератор
def sumaDivisores(n):
return sum((i for i in range(1, abs(n) + 1) if n % i == 0))
print(sumaDivisores(10)) # 18
В этом случае оставил тебе два варианта, форму clГЎsica и другая используя генераторы Пайтона.
, Если мой ответ ты ayudГі, mГЎrcala как , принятые (checkmark вњ “зелень), а dГ©jame знать, что он пошел плохо.
Твоя проблема состоит в том, что ты должен оставаться, - делящий и не сохраняется числа, которое нужно разделять adenmas, нет санкционировать случаи, которых 0
def sumaDivisores(n, divisor = None):
n = abs(n)
if divisor == 0: #Caso Base
return 0
if not divisor:
divisor = n
divisor_valido = 0
if (n%divisor == 0):
divisor_valido = divisor
suma = divisor_valido + sumaDivisores(n , divisor -1 )
return suma
print(sumaDivisores(8))
print(sumaDivisores(9))