使用递归来添加奇数

0 c# recursion

我正在尝试编写一种方法来计算所有小于给定数字的数字中奇数的总和.所以,例如.CalcOdd(7)将返回5 + 3 + 1 = 9.CaldOdd(10)将返回9 + 7 + 5 + 3 + 1 = 25等

该方法需要输入一个数,减去1,然后递归地向后工作,添加所有奇数,直到它达到0.这就是我到目前为止所拥有的.

    private static int CalcOdd(int n)
    {            

        if (n <= 1)
            return 1;
        else
            if (n % 2 == 0)
                n--;

        return n + CalcOdd(n - 2);
    }
Run Code Online (Sandbox Code Playgroud)

它不能很好地工作,它包括添加中传入的数字,这不是我想要的.谁能建议更好的方法呢?我也愿意能够将答案移植到偶数号码并添加选项以在答案中包含原始传递的号码.

非常感谢

Mar*_*ell 9

你为什么要在这里使用递归?只是循环; 或者更好,弄清楚用简单的等式做数学...

事实上,C#并没有为数学这样的东西带来出色的深度递归; 目前还没有真正的尾声.

循环方式:

private static int CalcOdd(int n)
{
    int sum = 0, i = 1;
    while (i < n)
    {
        sum += i;
        i += 2;
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

  • "你为什么要在这里使用递归?" 也许他的教授希望他使用递归;) (7认同)

Seb*_*olm 5

如你所说,你可以用递归来做到这一点,但是如果你想更快地做,那么我可以告诉你n个第一个奇数的总和等于n*n.

private static int CalcOdd(int n) {
    if (n<=1)
        return 0;

    if (n%2 == 1)
        n--;

    int k = n/2;

    return k*k;
}
Run Code Online (Sandbox Code Playgroud)

这有效的原因是:

每个偶数的形式为2k,前面的奇数是2k-1.

因为2 *1-1 = 1,所以在2k以下有k个奇数.

如果n是奇数,我们不想包含它,所以我们只需要下面的偶数,我们就会自动拥有我们想要的东西.

编辑修复损坏的代码.