我正在解决简单的数学任务,我遇到了一些问题。我已经编写了递归函数,但是我没有得到与计算器相同的结果。例如 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());
}
}
}
答案 0 :(得分:2)
是否必须是递归函数?它可以在没有递归的情况下完成:
float result = 0;
float temp = 1;
for(int i = 0; i < n; i++) {
temp *= a + i;
result += 1 / temp;
}
我还没有对它进行测试,但这是一个非常简单的算法,所以它应该可以工作。
答案 1 :(得分:2)
我已经模拟了你的情况:
您不需要将 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。
答案 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;
}