C#

时间:2018-05-22 18:35:17

标签: c# recursion precision sine

作为一项练习,我们的学徒之一应该实现一个递归的正弦函数。 (使用广义连续分数) 我试图帮助他,相比之下做了相当多的编码,现在我遇到了一个我不明白的问题。

我有一个有效的功能。 我不明白的是为什么我的前三或四次尝试都失败了。 我试着一步一步调试这个东西,但我无法查明我的错误。我真的很想知道我错过了什么。

请注意,因为代码并不尽可能美观。这是我在5分钟内(很多次)写下的快速而肮脏的概念证明。

这是不起作用的代码:

// number = the angle in radian

static double sinus(double number, double exp = 1, bool mustAdd = false, double precision = 0.000001)
{
    if (number < 0) throw new ArgumentException("sinus");
    if (number == 0) return 0;
    double result = ((Math.Pow(number, exp)) / factorial(exp));
    Console.WriteLine(result);

    if (result > precision)
    {
        if (mustAdd)
            return result += sinus(number, exp + 2, !mustAdd);
        else
            return result -= sinus(number, exp + 2, !mustAdd);
    }
    else
        return result;
}

我使用中间值打印每次迭代,以验证一切是否正常工作。值是正确的。

这是我提出的工作代码(是的,它也很脏):

static double Altersinus(double number, double exp = 1, bool mustAdd = true, double precision = 0.000001, double result = 0)
{
    if (number < 0) throw new ArgumentException("altersinus");
    if (number == 0) return 0;

    double tmp = ((Math.Pow(number, exp)) / factorial(exp));
    Console.WriteLine(tmp);

    if (tmp > precision)
    {
        if (mustAdd)
            result += tmp;
        else
            result -= tmp;
        result = Altersinus(number, exp + 2, !mustAdd, precision, result);

    }

    return result;
}

我也在编写中间值,它们与不起作用的函数完全相同。

同样,我真的不是在寻找解决方案,没有急于求成。我只是想了解它为什么不起作用。我想知道我的两种方法在技术上有什么不同。

任何想法都会非常感激。

干杯。

修改

我尝试使用值3.14159265358979(大约180度)的两个函数

这两个函数都打印这些中间值:

3.14159265358979
5.16771278004997
2.55016403987735
0.599264529320792
0.0821458866111282
0.00737043094571435
0.000466302805767612
2.19153534478302E-05
7.95205400147551E-07

不起作用的方法返回-3.90268777359824,结果完全错误。

有效的那个返回-7.72785889430639E-07。大致相当于零。

1 个答案:

答案 0 :(得分:0)

我明白了。

让我们用'nx'代替微积分,其中x是曝光剂,n是数字。

在有效的功能中,我实际上是这样的:

Sine(n)=n1/1! - n3/3! + n5/5! - nx/x!...

但是那个不起作用的那个略有不同。它正在做其他事情:

Sine(n)=n1/1! - (n3/3! + (n5/5! - (nx/x!...)))

这里的关键是括号。 由于减法,它正在影响微积分的大时间。

如果只有添加它不会导致任何问题。