使用链接列表的Java递归二项系数

时间:2012-02-04 03:57:04

标签: java recursion linked-list binomial-coefficients

我的compsci UIL类中存在一个挑战问题,即使用尾递归来获取给定数字的二项式系数列表。我认为我非常接近但我在基础案例上遇到了困难。

以下是我的代码:

 public static Cons binomial(int n) 
    {
        return binomialb(n, null, 1);

    }
public static Cons binomialb(int n, Cons last, int power)
{

    if(n == power || n < 0)
    {
        return cons(1, null);
    }   
    else if(last == null)
    {
        last = cons(1, cons(1, null));
        return binomialb(n-1, last, power);
    }
    else
    { 
        Cons lst = cons(1, null);
        while(rest(last)!=null)
        {
        lst = cons((Integer)first(last)+(Integer)first(rest(last)), lst);
            last = rest(last);
        }
        return binomialb(n-1,lst,power);
    }

}

现在我只得到(1).....

的清单

1 个答案:

答案 0 :(得分:0)

您的递归调用始终为binomialb(n-1,something,power),因此唯一更改的内容是第一个参数n和列表。您的初始通话时间为power = 1,因此将永久保留。现在你的第一个条件是

if (n == power || n < 0) { 
    return cons(1,null);
}

如果您最初使用n > 1进行呼叫,则binomialb(n-k,...,1)的呼叫将变为k = 1, ..., n-1。最后,呼叫为binomialb(1,lotsOfWastedWork,1),我们将很高兴地返回cons(1,null)。如果您最初使用n < 1进行调用,则n < 0会在最多一次递归调用后返回相同内容,n = 1会立即返回cons(1,null)

每当last在通话中不为空时,您应该使用它。