Рабочая тетрадь по Python: Упражнение 69 — Приблизительный pi

#python #pi

#питон #pi

Вопрос:

Я новичок в Python и в настоящее время изучаю рабочую тетрадь по Python Бена Стивенсона. Я застрял в упражнении 69, и мое значение pi расходится …. кто-нибудь может помочь? Какие-либо ошибки в моем коде?

Я также приложил сюда вопрос с упражнением. Вопрос об упражнении

 #Exercise 69: Approximate pi

maxrun = 15
denominator1 = 2
denominator2 = 3
denominator3 = 4
fractionpos = (4/(denominator1*denominator2*denominator3))
denominatora = 4
denominatorb = 5
denominatorc = 6
fractionneg = -4/(denominatora*denominatorb*denominatorc)

pi = 3
count = 1

while maxrun != 0:
    if count %2 != 0:   #odd runs are positive
        pi = pi fractionpos
        print('Approximation',count,'pi value is',pi)
        count = count 1
        denominator1 = denominator1 4
        denominator2 = denominator2 4
        denominator3 = denominator3 4
        maxrun = maxrun-1
    elif count %2 ==0:    #even runs are negative
        pi = pi fractionneg
        print('Approximation',count,'pi value',pi)
        count = count 1
        denominatora = denominator1 4
        denominatorb = denominator2 4
        denominatorc = denominator3 4
        maxrun = maxrun-1
 

Ответ №1:

Каждый раз, когда вы обновляете свои знаменатели, вам также нужно будет обновлять свою дробь. Прямо сейчас ваши fractionpos и fractioneg не меняются, и поэтому на каждой итерации вы добавляете исходные термины. Вот почему ваше приближение pi расходится.

Мы можем исправить это, обновив fractionpos и fractionneg после обновления наши знаменатели.

 if count %2 != 0:   #odd runs are positive
    pi = pi fractionpos
    print('Approximation',count,'pi value is',pi)
    count = count 1
    denominator1 = denominator1 4
    denominator2 = denominator2 4
    denominator3 = denominator3 4
    fractionpos = (4/(denominator1*denominator2*denominator3))
    maxrun = maxrun-1
else:    #even runs are negative
    pi = pi fractionneg
    print('Approximation',count,'pi value',pi)
    count = count 1
    denominatora = denominator1 4
    denominatorb = denominator2 4
    denominatorc = denominator3 4
    fractionneg = -4/(denominatora*denominatorb*denominatorc)
    maxrun = maxrun-1
 

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

1. Удивительно!! Я не знал, что мне нужно обновлять мои fractionpos и fractionneg, это сработало!

Ответ №2:

В вашем коде есть две проблемы:

 pi = pi fractionpos # This does not work because its value stays the same.
 

fractionpos и fractionneg должен обновляться каждый раз, когда вы меняете знаменатели. Вы можете сделать это, переназначив им значение в цикле while.

В вашем elif заявлении вы должны добавить 4 denominatora вместо denominator1 , а также другие.

  elif count %2 ==0:    #even runs are negative
        pi = pi fractionneg
        print('Approximation',count,'pi value',pi)
        count = count 1
        denominatora = denominator1 4  # This goes wrong and the following as well
        denominatorb = denominator2 4
        denominatorc = denominator3 4
        maxrun = maxrun-1
 

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

1. Ах да, я обновил его сейчас, большое спасибо! Какое замечательное сообщество!

Ответ №3:

У вас есть две проблемы в этом коде.

Во-первых, когда вы выполняете отрицательную часть дроби, вы должны добавлять 4 к знаменателю, b, c вместо 1,2,3.

Во-вторых, fractionpos и fractionneg вычисляются только один раз. Вам нужно пересчитывать их на каждой итерации.

Кроме того, вы можете избавиться от denominatora,b, c и просто использовать 1,2,3 для обоих, если вы добавляете только по два в каждый цикл. Если вы хотите немного усложнить задачу, вы можете сделать это с помощью одной знаменательной переменной вместо трех

Поскольку вы изучаете Python и это упражнение для вас, я рекомендую вам не просто копировать приведенный ниже код, а вместо этого вносить изменения самостоятельно. Получайте удовольствие от Python!

     if count %2 != 0:   #odd runs are positive
        pi = pi (4/(denominator1*denominator2*denominator3))
        print('Approximation',count,'pi value is',pi)
        count = count 1
        denominator1 = denominator1 4
        denominator2 = denominator2 4
        denominator3 = denominator3 4
        maxrun = maxrun-1
    elif count %2 ==0:    #even runs are negative
        pi = pi -4/(denominatora*denominatorb*denominatorc)
        print('Approximation',count,'pi value',pi)
        count = count 1
        denominatora = denominatora 4
        denominatorb = denominatora 4
        denominatorc = denominatora 4
        maxrun = maxrun-1
 

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

1. Удивительно!! Большое спасибо за вашу помощь!! Да, знаменатель123 должен быть abc (упс). Мне нравится ваше предложение просто добавлять 2 в каждый цикл, я боролся с чередованием положительных и отрицательных знаков, но я мог бы еще немного попрактиковаться и попытаться заставить это работать. 🙂