Причина, по которой первая версия не работает, заключается в том, что вы потенциально дважды изменяете number
в l oop.
С помощью else
, который вы тестируете number % 2
- если нет остатка, вы меняете number
путем деления его на два, тогда else пропускается, и вы снова тестируете числа !=
1 и l oop. Если - это остаток, вы пропускаете это и выполняете остальное, устанавливая number = 3 * number + 1
и снова проверяете число !=
1 на l oop. В любом случае вы изменили «число» только в один из двух возможных способов.
С двумя ifs вы проверяете number % 2
- если нет остальное вы изменяете number
путем деления его на два, затем вы тестируете number % 2
снова ... но number
могли бы изменить перед тестированием во второй раз.
Представьте себе, что вы выполняете это с числом, начинающимся с 6
6, разделенным на 2, это 3 с остатком 0, поэтому 6 % 2 == 0
и вы выполняете number = number//2
, что дает 3
Сейчас вы тестируете if number % 2 != 0
… но число сейчас уже 3, а 3, деленное на 2, равно 1 с остатком 1 - то есть 3 % 2 == 1
, так что number % 2
действительно != 0
, поэтому теперь вы меняете номер снова , во второй раз в l oop.
С else
нет никак вы будете менять число дважды за одну итерацию цикла; с двумя 'если вы можете разделить на 2 , а затем также умножить и добавить.