可以';t求解递归数学表达式

本文关键字:递归 表达式 可以 | 更新日期: 2023-09-27 18:25:18

我正在解决简单的数学任务,我遇到了一些问题。我已经编写了递归函数,但并没有得到和计算器中相同的结果。例如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());
        }
    }
}

可以';t求解递归数学表达式

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

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

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

我已经模拟了您的情况:

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

  2. 您需要2个递归函数

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。

您需要重置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());
        }
    }
}

如果不需要的话,我不建议使用递归。我会尝试将其表示为循环,因为递归可能会根据输入导致stackerflow(尤其是如果参数是按值传递的)。

例如:

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;
}