2015-05-27 7 views
1

Я попытался создать программу в python, которая в основном суммирует серию до термина, который меньше 0, который выглядит следующим образом: 1+((2X)/1!)+((3X^2)/2!)+((4X^3)/3!).... Я разработал базовый термин для каждого термина в серии, который ((A+1)((X)^A))/A!, где A увеличивается в цикле через термины. В приведенной ниже программе отсутствует ошибка компиляции, однако она не показывает результат. Пожалуйста помоги. Было бы очень благодарно. Спасибо!Суммирование программы на Python серии

import decimal 
def fact(n): 
    if n == 0: 
     return 1 
    else: 
     return n*(fact(n-1)) 
x = int(input("Enter the value of x")) 
A=0 
summation=0 
sumt1=(A+1) 
sumt2=(x**A) 
sumt3=fact(x) 
sumt4=sumt1*sumt2 
sumt5=sumt4/sumt3 

while (sumt5 > 0.00) : 
    summation = summation+sumt5 
    A+=1 
finalsum=decimal.Decimal(1+summation) 
print("The value is") 
print(finalsum) 
+5

Вы никогда не изменять значение 'sumt5', так' (sumt5> 0,00) 'всегда будет истинным и цикл никогда не закончится. – Frxstrem

ответ

1

переместить sumt переменные в ваше время цикла, а затем выйти из цикла, когда sumt5 <= 0.00:

import decimal 

def fact(n): 
    if n == 0: 
     return 1 
    else: 
     return n*(fact(n-1)) 

x = 1 # Hardcoded for this example, instead of prompting. 
A = 0 
summation = 1.0 

while True: 
    sumt1 = A + 1 
    sumt2 = x**A 
    sumt3 = fact(A) # Was `fact(x)` in original code, which didn't match your formula & prevented `sumt5 <= 0.00` from ever being true. 
    sumt4 = sumt1 * sumt2 
    sumt5 = sumt4/sumt3 

    summation += sumt5 
    A += 1 

    if sumt5 <= 0.00: 
     break 


finalsum=decimal.Decimal(summation) 
print("The value is {}.".format(finalsum)) 

Обновлено Ответ

Я хотел понять, что происходит лучше для себя, поэтому я разбил суммирование на отдельную функцию и вместо того, чтобы вычислять все отдельные термины отдельно, я подключил их непосредственно к функции, которую вы дали в OP: ((A+1)((X)^A))/A!. Вот мой код:

import decimal 

def factorial(n): 
    if n == 0: 
     return 1 
    else: 
     return n * factorial(n - 1) 


def summation(num): 
    A = 0 
    result = 1.0 

    while True: 
     term = (A + 1) * num**A/factorial(A) 
     result += term 
     A += 1 

     if term <= 0.0: # Break out of the loop when the `term <= 0`. 
      break 

    return result 


# Sample output.  
for i in range(1, 11): 
    final = decimal.Decimal(summation(i)) 
    print('summation({}) == {}'.format(i, final)) 

Когда я побежал, я получил следующий вывод:

final == 6.43656365691809018159119659685529768466949462890625 
final == 23.167168296791945891754949116148054599761962890625 
final == 81.3421476927506574838844244368374347686767578125 
final == 273.99075016572106733292457647621631622314453125 
final == 891.478954615459542765165679156780242919921875 
final == 2825.00155444914480540319345891475677490234375 
final == 8774.06526742766800452955067157745361328125 
final == 26829.62188337555198813788592815399169921875 
final == 81031.839275753838592208921909332275390625 
final == 242292.12374287386774085462093353271484375 
+0

Большое спасибо! Наконец работает. Блестящая работа, отлаживающая код, у меня возникали головные боли. –

+0

Последующий вопрос, и это может быть легко. Как изменить код так, чтобы цикл for суммировал термины upto до того, что член меньше или равен нулю. У вас есть определенный диапазон в вашем коде, который равен 1,11, но что, если этот термин относится, например, к 56-му терминам за один проход и 101-м в другом. Можно ли использовать переменную в диапазоне()? Если да, то где я должен определить эту переменную. Благодаря! –

+0

Вы имеете в виду модифицировать цикл while? В этом случае цикл 'for' используется только для демонстрационных целей. Если вы ссылаетесь на цикл while, просто переместите 'if ... break' так, чтобы он был впереди' result + = term'. Таким образом, он все равно вычислит этот термин, но добавит его только к результату, если «term> 0.0». И да - вы можете использовать переменную в 'range()' (опять же, это только для демонстрационных целей, но это не является существенной частью решения). Вы можете определить эту переменную, но вы хотите, т. Е. Инструкцию 'input()', как вы использовали в своем исходном сообщении. –

Смежные вопросы