Код Python 3.7 не будет зациклен и возвращает ошибку имени - PullRequest
0 голосов
/ 15 октября 2018

Прежде всего, я очень новичок в программировании, так что терпите меня.У меня следующие проблемы с моим текущим кодом, которые я не могу понять.Я не могу получить конец цикла на основе пользовательских данных.Теперь код возвращает ошибку имени.Кто-нибудь знает, как я могу это исправить?Спасибо за ваше время.

def gcd(a,b):    

    start_over = "true" 
    while start_over == "true":



        while True:
            a = int(input("Enter your first positive whole number: "))
            if a < 1 :
                print(a ,"IS NOT A POSITIVE WHOLE NUMBER")
                print("")
                continue

            else:
                break
        while True:
            b = int(input("Enter your second positive whole number: "))
            if b < 1 :
                print(b ,"IS NOT A POSITIVE WHOLE NUMBER")
                print("")
                continue

            else:
                break

        if (b==0):
                return a
        else:
            return gcd(b,a % b)

        gcf = gcd(a,b)


        print("the GCD of", a,"and", b,"is: ", gcf)

        redo_program = input("To perform another computation type Y/Yes or to quit type N/No: ").lower()

        if redo_program == "y" or "yes":
            start_over = "true"


        else:
            start_over ="null"
            print("GOODBYE")



gcd(a,b)     

1 Ответ

0 голосов
/ 15 октября 2018

Ваш код сбивает с толку и переплетает две части.Предположительно, вы хотите

  • Запросить у пользователя два числа
  • Рекурсивно оценить наибольший общий делитель из них

Но функция gcd ожидает обоихдва числа в качестве параметров, а также просит пользователя ввести числа (тем самым игнорируя параметры), а также рекурсивно вызывает себя.

Ошибка имени происходит из последней строки, gcd(a, b), где вы пытаетесь получить GCD a и b - но a и b еще не были введены (так как вы делаете это только внутри функции).

Даже если этот бит сработает, ваша функция рассчитывает, что для вычисления GCD из двух больших чисел потребуется вычислить GCDиз двух меньших чисел заранее.Пока все хорошо - за исключением того, что вы никогда не вычисляете GCD меньших чисел, а вместо этого запрашиваете у пользователя новую, не связанную пару чисел для вычисления GCD, и забываете о расчете предыдущей пары.

Такжеобратите внимание, что ваше условное выражение if b == 0 имеет return в обеих ветвях, поэтому код под ним в функции gcd никогда не будет достигнут.

Поэтому, чтобы сделать то, что вы хотите, попробуйте изменить код напоместите этот псевдокод:

function gcd(a, b)
    calculate GCD without asking user anything

presume user wants to continue
loop while user wants to continue
    ask for two numbers
    calculate GCD
    print result
    ask the user if they want to continue

Кроме того, у вас есть несколько странных строк.Это на самом деле не ошибка , если только я не пропустил что-то, чтобы строка "true" указывала на истинное значение, или строка "null" для значения не было, но это очень, очень плохая форма - есть специальныезначения True и None в Python для этих ролей (вы даже правильно использовали True в while True).

...