Python函数返回第一个值两次

时间:2016-02-08 19:19:31

标签: python python-2.7 return-value trigonometry

我已经写了这个函数来计算sin(x)使用泰勒级数到任何指定的准确度,'N个术语',我的问题是结果没有按预期返回,我无法弄清楚为什么,任何帮助将不胜感激。

我期待的是: 1 6.28318530718 2 -35.0585169332 3 46.5467323429 4 -30.1591274102 5 11.8995665347 6 -3.1.19507604213 7 0.624876542716 8 -0.0932457590621 9 0.0109834031461

我得到的是: 1无 2 6.28318530718 3 -35.0585169332 4 46.5467323429 5 -30.1591274102 6 11.8995665347 7 -3.19507604213 8 0.624876542716 9 -0.0932457590621

提前致谢。

def factorial(x):
    if x <= 1:
        return 1
    else:
        return x * factorial(x-1)

def sinNterms(x, N):
    x = float(x)

    while N >1:
        result = x
        for i in range(2, N):
            power = ((2 * i)-1)
            sign = 1
            if i % 2 == 0:
                sign = -1
            else:
                sign = 1
            result = result + (((x ** power)*sign) / factorial(power))
        return result

pi = 3.141592653589793
for i in range(1,10):
    print i, sinNterms(2*pi, i)

1 个答案:

答案 0 :(得分:1)

我看到你将返回放在for会将其从while循环中删除。您应该解释这是否是您的意思。但是,鉴于for i in range(1,10):意味着您将忽略第一个条目并在输入参数i为1时返回None。这真的是您想要的吗?此外,由于您始终在计算后退出,因此不应使用while N > 1,而应使用if N > 1来避免无限递归。

您的结果关闭的原因是您使用的范围不正确。 range(2, N)为您提供2 to N-1的号码列表。因此range(2, 2)会为您提供一个空列表。

您应该计算range(2, N+1)

def sinNterms(x, N):
    x = float(x)

    while N >1:
        result = x
        for i in range(2, N):

您的评论说明您的代码行的顺序错误。你应该

def sinNterms(x, N):
    x = float(x)

    result = x
    # replace the while with an if since you do not need a loop
    # Otherwise you would get an infinite recursion
    if N > 1:
        for i in range(2, N+1):
            power = ((2 * i)-1)
            sign = 1
            if i % 2 == 0:
                sign = -1
            # The else is not needed as this is the default
            # else:
            #     sign = 1
            # use += operator for the calculation
            result += (((x ** power)*sign) / factorial(power))
    # Now return the value with the indentation under the if N > 1
    return result

注意,为了处理设置factorial的东西,返回一个不是int的浮点数。

保存一些计算的另一种方法是

def sinNterms(x, N):
    x = float(x)
    lim = 1e-12
    result = 0
    sign = 1
    # This range gives the odd numbers, saves calculation.
    for i in range(1, 2*(N+1), 2):
        # use += operator for the calculation
        temp = ((x ** i)*sign) / factorial(i)
        if fabs(temp) < lim:
            break
        result += temp
        sign *= -1
    return result