Suma de divisores de un número con recursión

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.

1
задан 19.12.2018, 07:48
4 ответа

То, что пришло в голову мне, слегка mГЎs сложно, что то, что ты пробовал tГє. Я подозреваю, что должна быть форма mГЎs простая. В любом случае, я объясняю тебе, что quГ© tenГ-схвати зло и я lГ-nea размышления.

Перекурсивное размышление на делителях одного nГєmero serГ - в:

  • , Поскольку mГ-nimo сам nГєmero разделяется в sГ - сам, потом n должен быть часть суммы.
  • AdemГЎs Г©l, если мы находим другой делитель 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.

1
ответ дан 20.11.2019, 02:13
  • 1
    Если, оно функционирует. Но до dó nde я понимаю в recursió n не нужно использовать циклы while или for. Из-за которого habrí которого funció думать в; n помощник, который определял бы, если nú морской окунь делящий n. – jsuarezbaron 18.12.2018, 10:49
  • 2
    Ну, в этом случае цикл, который появляется не está там чтобы заменять recursió n, а só это, чтобы находить делитель. Цикл, который мы предотвращаем с recursió n serí в складывания n + n//d1 + d1//d2 + d2//d3... + 1. Но habrí по отношению к которому иметь просвет, если они запрещают тебе этот цикл tambié n. В любом случае, любой цикл может быть замененным из-за recursió n, но serí в другая recursió n для другой цели: " Находить первый делитель n" – abulafia 18.12.2018, 10:58
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)
1
ответ дан 20.11.2019, 02:13

Эта проблема решена очень fГЎcilmente формы iterativa, но, ввиду того, что estГЎs, прося делать это перекурсивной формой, acГЎ я оставляю тебе две версии. Она explicaciГіn каждой estГЎ внизу.

VersiГіn переиталик

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, которые реализуют два задания основательно:

  1. Вычислять сумму делителей меньших, чем настоящий делитель
  2. AГ±adir в вышеупомянутую сумму настоящий делитель, если и только, если это - действительно делитель vГЎlido Ясный

estГЎ, что базовый случай, - когда настоящий делитель - 0, в случае которых возвращают 0, как он суммирует.

VersiГіn iterativa

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 знать, что он пошел плохо.

1
ответ дан 20.11.2019, 02:13

Твоя проблема состоит в том, что ты должен оставаться, - делящий и не сохраняется числа, которое нужно разделять 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))
0
ответ дан 20.11.2019, 02:13
  • 1
    Он мне кажется, что с ú ltima lí nea не tendrá в счете в сам n как делитель. Например для n = 3 сумма должна давать 4 и дает 2. – jsuarezbaron 18.12.2018, 13:18
  • 2
    складывал остаток не делитель, пожалуйста проверь снова – JackNavaRow 19.12.2018, 04:26