编程从i到n求和的递归方法

时间:2015-02-09 16:13:48

标签: java algorithm recursion

我正在尝试编程一个递归方法,用于从i到n求和以下等式,其中f(0)= f(1)= 1。

f(n) = from i = 1 to n ∑f(i-1) * f(n-i)

这是我到目前为止所做的,当n = 4时,它会给我一个堆栈溢出错误

3 个答案:

答案 0 :(得分:1)

您的方法与您提供的等式不符。你声明:

n ∑c(i-1)*c(n-i)

但你的最终回复声明是:

c(i-n) * c(i-1)

也许你应该尝试:

c(n-i) * c(i-1)

当我传入4时,它会生成以下调用堆栈:

i = 0, n = 4
  c(i - n) with i = 1

i = 1, n = -3
  c(i - n) with i = 1

i = 1, n = 4
  c(i - n) with i = 2

i = 2, n = -2
  c(i - n) with i = 2

i = 2, n = 4
  c(i - n) with i = 3

i = 3, n = -1
  c(i - n) with i = 3

i = 3, n = 4
  c(i - n) with i = 4 becomes c(0) becomes 1
  c(i - 1) with i = 4

i = 4, n = 3
  c(i - n) with i = 4 becomes c(1) becomes 1
  c(i - 1) with i = 4 becomes c(3) and it repeats from this point on

所以基本上当i达到4而你的n为3时,你最终会调用c(3),然后再次触发c(i - 1)又名c(3)试。

如果您进行了我建议的更改,则调用相同的调用:

c(n - i) -> c(4 - 1)
  c(n - i) -> c(3 - 2) -> c(1) -> 1
  c(i - 1) -> c(1) -> 1
c(i - 1) -> c(1) -> 1

在最后一行i已成为2,即使它位于顶层,因为该变量具有共享特性。

答案 1 :(得分:1)

如果你真的需要使用递归,你的函数将如下所示:

static long catalan(int n) {
    return c(1, n);
}

static long c(int i, int n) {
    if (n <= 1) {
        return 1;
    } else if (i > n) {
        return 0;
    } else {
        return catalan(i - 1) * catalan(n - i) + c(i + 1, n);
    }
}

虽然正如其他人所说的那样,使用memoization的版本会快得多,如果你只是为了学习和测试而这样做的话会很好。

  • if (n <= 1) return 1是您的基本情况。
  • else if (i > n) return 0是在i大于n时停止加总。
  • return catalan(i - 1) * catalan(n - i) + c(i + 1, n)是总和,其中i增加1直到达到n。

答案 2 :(得分:0)

对于递归总和,您将获得如下内容:

public int sum(int start, int end)
{
  if(start >= end)
  {
    return end;
  }
  return start +sum(start+1,end);
}

此方案可以适应您要使用的公式:

 static long c(long x)
  {
    if(x <2) return 1;
    return sumC(1,1,x);
  }

  static long sumC(long start,long current,long stop)
  {
      if(current>stop) return 0;
      return c(current-1)*c(stop -current) + sumC(start,current+1,stop);
  }
  

0到10:   1   1   2   五   14   42   132   429   1430   4862   16796