#python
#python
Вопрос:
После того, как я отредактировал свой код, я понял, как это сделать:
def sum_factors(n):
sum = 0
factor = 1
# Return the sum of all factors of n, not including n
while n!=0 and factor < n:
if n % factor == 0:
sum = sum factor
factor = factor 1
else:
factor = factor 1
return sum
Мой первоначальный код не мог суммировать множители, но я не понимаю, почему:
def sum_divisors(n):
sum = 0
factor = 1
# Return the sum of all divisors of n, not including n
while n % factor == 0 and factor < n:
sum = sum factor
factor = factor 1
return sum
Не могли бы вы объяснить, почему мой первоначальный код не работал?
Комментарии:
1.
while
Цикл завершится в первый разn % factor
, если он не равен нулю.
Ответ №1:
Ваш цикл while записывает
while n % factor == 0 and factor < n:
Это будет означать, что как только условие проверки коэффициента n% будет ложным, код выйдет из цикла while.
Давайте используем 10 в качестве примера.
10 % 1 равно нулю, а 10 % 2 равно 0. Но 10 % 3 не равно 0. Это означает, что мы выходим из цикла while, как только коэффициент достигает 3.
Тогда ответ, который мы получим, будет суммой 1 и 2, что было бы неверно.
Ответ №2:
В исходном коде особое внимание уделяется условию while n % factor == 0
, которое не является необходимым условием для завершения цикла while.
Ответ №3:
Иногда это помогает добавить некоторые выходные данные отладки в программу Python:
def sum_divisors(n):
sum = 0
factor = 1
# Return the sum of all divisors of n, not including n
print(f"factor = {factor}")
while n % factor == 0 and factor < n:
sum = sum factor
factor = factor 1
print(f"factor = {factor}")
return sum
print(sum_divisors(30))
Вывод
factor = 1
factor = 2
factor = 3
factor = 4
6
Примечания
Как мы можем видеть, цикл while завершается, когда он находит число, которое не является фактором.
Рефакторинг
Я заметил, что у вас есть дублирующийся код в вашем if-else
блоке. Всякий раз, когда это происходит, вы можете переместить общий код за пределы:
if n % factor == 0:
sum = sum factor
factor = factor 1