Идеальная квадратная функция, которая не возвращает

#python #loops #if-statement

#питон #петли #if-оператор

Вопрос:

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

 def perfsq(n):

    x = 0
    xy = x * x
    if n >= 0:
        while xy < n:
            x  = 1

        if xy != n:
            print (("%s is not a perfect square.") % (n))
            x -= 1
            print (("%s is the next highest perfect square.") % (xy))
        else:
            return(print(("%s is a perfect square of %s.") % (n, x)))
 

Когда я запускаю код для выполнения функции, он ничего не выводит. Я признаю, что испытываю трудности, и если бы вы могли дать мне несколько советов о том, как это исправить, я был бы благодарен.

Комментарии:

1. Посмотрите на свой while цикл. Когда он перестанет зацикливаться?

2. Не могли бы вы опубликовать некоторые результаты?

3. Подсказка, не связанная с кодом: все идеальные квадраты являются суммами последовательных нечетных целых чисел

4. return(print(... в этом мало смысла. Не путайте функции возврата и печати.

5. xy = x*x выполнение один раз вне цикла не приведет xy к тому, что оно всегда будет равно x*x внутри цикла. Переменные Python не похожи на ячейки электронной таблицы, которые автоматически обновляются при изменении других значений.

Ответ №1:

ваше условие цикла, которое

 while xy < n:
 

это будет верно всегда, поскольку xy всегда равно 0, а n всегда больше нуля, если вы вызовете функцию с n = 0, она напечатает 0 is a perfect square of 0. и вернет None .

 for n > 0
 

почему это всегда true в случае xy < n , потому что вы назначили xy 0 и никогда не изменяли его на какое-либо другое значение, когда цикл запускает его, проверьте условие, и оно всегда будет получать True

Ответ №2:

Как говорит Патрик Хо, попробуйте проверить, когда завершается цикл while. Может быть полезно поместить операторы print() по всему вашему методу, чтобы выяснить, как выполняется ваш метод. Чтобы выяснить, когда ваш цикл завершается, посмотрите на условие выхода вашего цикла while: xy < n .

Помните, что переменная не обновляется, пока вы ее не обновите.

 def perfsq(n):
    x = 0
    xy = x * x
    print("xy: {}".format(xy))
    if n >= 0:
        while xy < n:
            x  = 1
            print("xy in loop: {}".format(xy))

        if xy != n:
            print (("%s is not a perfect square.") % (n))
            x -= 1
            print (("%s is the next highest perfect square.") % (xy))
        else:
            return(print(("%s is a perfect square of %s.") % (n, x)))
 

Ответ №3:

Я вижу вашу ошибку, и кому-то легко ее совершить. Когда вы определяете

 xy = x*x
 

компьютер вычисляет x*x и присваивает этому числу значение xy . Поэтому, когда вы затем добавляете к x нему единицу, значение не изменяется xy . Вы должны указывать компьютеру пересчитывать xy каждый раз:

 while xy < n:
    x  = 1
    xy = x*x
 

Комментарии:

1. Возможно, было бы точнее сказать «Я вижу одну из ваших ошибок». Даже если они исправят эту единственную ошибку, результирующий код все равно не будет соответствовать спецификации функции.

Ответ №4:

 def perfsq(n):

    x = 0
    xy = x * x
    if n >= 0:
        while xy < n:
            x  = 1
            xy = x*x <-- Here

        if xy != n:
            print (("%s is not a perfect square.") % (n))
            x -= 1
            xy = x*x  <--Here
            print (("%s is the next highest perfect square.") % (xy))
        else:
            print(("%s is a perfect square of %s.") % (n, x)) <--And here
 

Подумайте об этом.