无法解决递归数学表达式

时间:2012-02-20 22:23:18

标签: c# .net math console-application

我正在解决简单的数学任务,我遇到了一些问题。我已经编写了递归函数,但是我没有得到与计算器相同的结果。例如 n = 2,a = 2 。有人能帮助我吗?

任务:

1/a + 1/(a+1) +...+ 1/(a(a+1)...(a+n)) 

到目前为止,这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _02__Part_A_
{
    class Program
    {
        float res = 1;

        public float func3(int n, int a)
        {
            if (n == 0)
                return 1 / (a * res);
            res = res * (a + n);
            n--;
            return func3(n, a);
        }

        static void Main(string[] args)
        {
            Program a = new Program();

            float resOFfunc3 = (float)0.5;
            string n = Console.ReadLine();
            string ak = Console.ReadLine();

            for (int nn = int.Parse(n); nn > 0; nn--)
            {
                resOFfunc3 += a.func3(nn, int.Parse(ak));
            }

            Console.WriteLine(resOFfunc3.ToString());
        }

    }
}

4 个答案:

答案 0 :(得分:2)

是否必须是递归函数?它可以在没有递归的情况下完成:

float result = 0;
float temp = 1;
for(int i = 0; i < n; i++) {
    temp *= a + i;
    result += 1 / temp;
}

我还没有对它进行测试,但这是一个非常简单的算法,所以它应该可以工作。

答案 1 :(得分:2)

我已经模拟了你的情况:

  1. 您不需要将 res 作为全局变量,否则为什么要首先制作递归函数?

  2. 您需要2个递归函数

  3. public float func3(int n, int a)
    {
        if (a == 0) return 0;
        if (n == 0) return  a;
        return 1 * func3(n - 1, a) * (a + n);
    }
    
    public float func4(int n, int a)
    {
        if (a == 0) return 0;
        if (n == 0) return 1/func3(n, a);
        return 1/func3(n, a) + func4(n - 1, a);
    }
    

    你只需要调用func4。

答案 2 :(得分:0)

你需要在for循环中重置res变量

namespace _02__Part_A_
{
    class Program
    {

        float res = 1;


        public float func3(int n,int a) {

            if (n == 0)
                return 1/(a*res);
            res = res * (a + n);
            n--;
            return func3(n,a);
        }

        static void Main(string[] args)
        {
            Program a = new Program();

            float resOFfunc3 = (float)0.5;
            string n = Console.ReadLine();
            string ak = Console.ReadLine();
            for (int nn = int.Parse(n); nn > 0; nn--)
            {
                res = 1;   // Need to add this
                resOFfunc3 += a.func3(nn, int.Parse(ak));
            }

            Console.WriteLine(resOFfunc3.ToString());
        }
    }
}

答案 3 :(得分:0)

如果不是必要的话,我不建议使用递归。我试着将它表示为循环,因为递归可能会导致stackoverflow取决于输入(特别是如果参数通过值传递)。

例如:

public float func(int n, int a) {
    float div = 1.0;
    float result = 0.0;
    for (int i = 0; i <= n; ++i) {
        div *= a + i;
        result += 1.0 / div;
    }
    return result;
}