2015-03-04 10 views
0

Я пытаюсь создать функцию, которая принимает значение x, и создает такой шаблон с n + 1 квадратными корневыми терминами: sqrt (x)^sqrt (x)^sqrt (x)^SQRT (х)^SQRT (х) ...Бесконечный цикл экспоненты - Python

def func(x,n): 
a = x**0.5 
i = 0 
while i < n: 
    a = a ** (x**0.5) 
    i += 1 

print a 

Например, используя х = 2, то функция не сходится (до 2), но растет экспоненциально в некотором роде, я не понимаю, почему ,

Для первой итерации (i = 0) это кажется правильным, поскольку он вычисляет sqrt (2)^sqrt (2), но для второй итерации (i = 1) он дает мне 2.0, и это продолжает расти.

Спасибо!

+3

Когда вы говорите 'SQRT (х)^SQRT (х)^SQRT (х)', вы хотите '(SQRT (х)^sqrt (x))^sqrt (x) 'или' sqrt (x)^(sqrt (x)^sqrt (x)) '? – Kevin

ответ

3

Для того чтобы сходиться, экспоненциальность должна рассматриваться как право-ассоциативная, то есть sqrt(x)^(sqrt(x)^(sqrt(x)^...)). Но ваш код вычисляет его как лево-ассоциативный: ((...^sqrt(x))^sqrt(x))^sqrt(x).

Вы должны изменить порядок терминов в

a = a ** (x**0.5) 

в

a = (x**0.5) ** a 
3

выше ответ на @interjay иллюстрирует то, что проблема с итерационным методом. В качестве альтернативы, вы можете также использовать рекурсивный метод для вычисления этого

from math import sqrt 
def fun(x,n): 
    if n == 0: 
     return sqrt(x) 
    else: 
     return sqrt(x) ** fun(x, n-1) 

>>> fun(2,2) 
1.7608395558800285 

>>> fun(2,3) 
1.8409108692910108 

>>> fun(2,10) 
1.988711773413954 

>>> fun(2,100) 
2.0000000000000004 
+0

Рекурсия !!! <3 –

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