可以';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());
}
}
}
它必须是递归函数吗?它可以在没有递归的情况下完成:
float result = 0;
float temp = 1;
for(int i = 0; i < n; i++) {
temp *= a + i;
result += 1 / temp;
}
我还没有测试过,但这是一个非常简单的算法,所以它应该可以工作。
我已经模拟了您的情况:
-
您不需要将res作为全局变量,否则为什么要首先创建递归函数呢?
-
您需要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;
}