猿问

C# 递归方法中的奇怪值

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


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


当心,因为代码并不像它想象的那么漂亮。这是我在 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;

}

我也在写中间值,和不工作的函数完全一样。


再说一次,我真的不是在寻找解决方案,也不着急。我只是想了解为什么它不起作用。我想知道我的两种方法在技术上有何不同。


任何想法将不胜感激。


干杯。


守着一只汪
浏览 96回答 1
微课
1回答

宝慕林4294392

我想到了。让我们用“nx”代替微积分,其中 x 是说明项,n 是数字。在起作用的函数中,我实际上是这样的:Sine(n)=n1/1!&nbsp;-&nbsp;n3/3!&nbsp;+&nbsp;n5/5!&nbsp;-&nbsp;nx/x!...但不起作用的那个略有不同。它正在做其他事情:Sine(n)=n1/1!&nbsp;-&nbsp;(n3/3!&nbsp;+&nbsp;(n5/5!&nbsp;-&nbsp;(nx/x!...)))这里的关键是括号。由于减法,它对微积分的影响很大。如果只是添加它不会引起任何问题。
随时随地看视频慕课网APP
我要回答