Код Python для постепенного суммирования ряда

#python #add #series

#python #Добавить #Серии

Вопрос:

Отличный сайт, и я действительно ценю все ответы и советы, которые я получаю отсюда. Я пытаюсь вычислить сумму последовательных приращений дробей, но, похоже, не получается правильно выполнить цикл в функции. Я смог написать программу для вычисления общей суммы и вычисления отдельных дробей в ряду, но мне нужно, чтобы она отображала текущую сумму на каждом шаге в строке. ряд 1/2, 2/3, 3/4, 4/5, …., 20/21. чтобы он отображал: 0.5000 1.1667 … 16.4023 17.3546

Это то, что у меня есть до сих пор:

 def frac(n, d):
    a = n / d
    return a

def main():
    count = 1
    while count <= 20:
        num = count
        den = count  1
        ans = frac(num, den)
        print(num, "    ", format(ans, ".4f"))
        count  = 1
main()
  

Но это дает мне только это:

 1      0.5000
2      0.6667
3      0.7500
4      0.8000
5      0.8333
6      0.8571
7      0.8750
8      0.8889
9      0.9000
10     0.9091
11     0.9167
12     0.9231
13     0.9286
14     0.9333
15     0.9375
16     0.9412
17     0.9444
18     0.9474
19     0.9500
20     0.9524
  

Ответ №1:

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

 def main():
    count = 1
    ans = 0
    while count <= 20:
        num = count
        den = count  1
        ans = ans   frac(num, den) #add previous ans here
        print(num, "    ", format(ans, ".4f"))
        count  = 1 
  

Ответ №2:

Вы также можете использовать itertools.accumulate для генерации этих значений:

 from itertools import accumulate
for i, ans in enumerate(accumulate(n/(n 1) for n in range(1, 21)), start=1):
    print(str(i).ljust(4), format(ans, '.4f'))
  

Вывод:

 1    0.5000
2    1.1667
3    1.9167
4    2.7167
5    3.5500
6    4.4071
7    5.2821
8    6.1710
9    7.0710
10   7.9801
11   8.8968
12   9.8199
13   10.7484
14   11.6818
15   12.6193
16   13.5604
17   14.5049
18   15.4523
19   16.4023
20   17.3546
  

Ответ №3:

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

 fractions = [ float(x)/(x 1) for x in range(1,21) ]
cumulatives = [sum(fractions[0:i 1]) for i,j in enumerate(fractions)]

for i,item in enumerate(cumulatives):
    print '{} {:.4f}'.format(i 1, item)
  

Это в python 2.7. Python 3.x itertools имеет функцию accumulate .
Посмотрите это в действии здесь: https://eval.in/658781

 1 0.5000
2 1.1667
3 1.9167
4 2.7167
5 3.5500
6 4.4071
7 5.2821
8 6.1710
9 7.0710
10 7.9801
11 8.8968
12 9.8199
13 10.7484
14 11.6818
15 12.6193
16 13.5604
17 14.5049
18 15.4523
19 16.4023
20 17.3546
  

Ответ №4:

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

 def frac(n, d):
    a = n / d
    return a

def main():
    total = 0
    for num in range(1, 21):
        ans = frac(num, num 1)
        total  = ans
        print(num, "    ", format(ans, ".4f"), 'total=', format(total, ".4f"))
main()
  

Вывод выглядит следующим образом:

 1      0.5000 total= 0.5000
2      0.6667 total= 1.1667
3      0.7500 total= 1.9167
4      0.8000 total= 2.7167
5      0.8333 total= 3.5500
6      0.8571 total= 4.4071
7      0.8750 total= 5.2821
8      0.8889 total= 6.1710
9      0.9000 total= 7.0710
10      0.9091 total= 7.9801
11      0.9167 total= 8.8968
12      0.9231 total= 9.8199
13      0.9286 total= 10.7484
14      0.9333 total= 11.6818
15      0.9375 total= 12.6193
16      0.9412 total= 13.5604
17      0.9444 total= 14.5049
18      0.9474 total= 15.4523
19      0.9500 total= 16.4023
20      0.9524 total= 17.3546
  

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

1. если вы перейдете на цикл for, тогда нет необходимости в count

2. Спасибо, переработано.