Как может блок кода if продолжаться с того места, где цикл прерван в таких случаях? - PullRequest
0 голосов
/ 18 сентября 2018

У меня нет никакого опыта в программировании, и я только начал изучать Python.

В книге Джона Гуттага "Введение в вычисления и программирование с использованием Python с применением для понимания данных", в началеВ главе 3 приведен пример кода:

#Find the cube root of a perfect cube
x = int(input('Enter an integer: '))
ans = 0
while ans**3 < abs(x):
    ans = ans + 1
if ans**3 != abs(x):
    print(x, 'is not a perfect cube')
else:
    if x < 0:
        ans = -ans
    print('Cube root of ' + str(x) + ' is ' + str(ans))

Что мне трудно понять, так это то, как «если» за пределами «времени» можно получить с того места, где цикл завершился с помощью итерации?Если это из-за последней итерации ans, которая выводит его из цикла, а также удовлетворяет условию if, как условие if работает для значений ans и, следовательно, x внутри цикла? (Ans ^ 3 не равноx только внутри цикла while, как может эта часть работать:

 if ans**3 != abs(x):
     print(x, 'is not a perfect cube')

Я действительно не знаю, как еще спросить об этом, но это код, который я придумал, прежде чем заглянуть в кодв книге это сработало, и, возможно, это поможет уточнить, что именно я спрашиваю:

x=int(input('Enter an integer: '))
crx=0

while True:
    if crx**3<abs(x):
        crx=crx+1
    elif crx**3==x:
        print('The cube root of',x,'is',str(crx)+'.')
        break
    elif crx**3==-x:
        print('The cube root of',x,'is',str(-crx)+'.')
        break
    else:
        print(x,'is not a perfect cube.')
        break

По моему мнению, каким-то образом мне пришлось вставить блоки кода if внутри цикла while ...

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Проще говоря - цикл гарантирует, что значение ans является самым низким (неотрицательным) целым числом, чей куб больше или равен x.Обратите внимание на следующее следствие:

  • , если x является идеальным кубом, то окончательное значение ans будет точно таким же корнем куба (поскольку мы знаем, что ans**3 должно быть равно x.
  • Если x не является идеальным кубом, то конечное значение ans должно быть таким, чтобы ans**3 строго превышало x. В частности, оно не будет равно ему.

Таким образом, вычисление выполняется исключительно в цикле while - и после этого if проверяет, вычислили ли вы точный корень куба или нет (в этом случаеэто никогда не было возможно, потому что x не был идеальным кубом.) И, конечно, он печатает соответствующее сообщение пользователю в любом случае.

(я только что видел редактирование с вашим собственным решением - да,как вы заметили, это также работает нормально. Редко есть только один способ решить проблему с кодом.)

0 голосов
/ 18 сентября 2018

Это не является следствием возврата if к циклу while.Давайте рассмотрим поток управления:

x задается как целое число из строки input

ans инициализируется значением 0, int

x = int(input('Enter an integer: '))
ans = 0

Чтобы проверить, имеет ли что-то корень куба, цикл while берет каждое целое число больше 0 и кубизирует его, если куб на меньше , чем x, тогда мы увеличиваем ans1, в противном случае ans сохраняется и цикл while завершается.Обратите внимание, что в противном случае распространяется, если куб больше или равен x.

while ans**3 < abs(x):
    ans = ans + 1

Если результирующий ans равен x, то xимеет кубический корень.Если это не так, x не является корнем куба.

if ans**3 != abs(x):
    print(x, 'is not a perfect cube')
else:
    if x < 0:
        ans = -ans
    print('Cube root of ' + str(x) + ' is ' + str(ans))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...