#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. Спасибо, переработано.