1

私の 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)のリストを取得するだけです.....

4

1 に答える 1

0

再帰呼び出しは常にbinomialb(n-1,something,power)であるため、変更されるのは最初のパラメーターnとリストだけです。あなたの最初の呼び出しには がpower = 1あるので、それは永遠に残ります。今、あなたの最初の条件は

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

n > 1最初に で呼び出すと、呼び出しはforbinomialb(n-k,...,1)になりk = 1, ..., n-1ます。最後に、呼び出しはbinomialb(1,lotsOfWastedWork,1)喜んで を返しcons(1,null)ます。最初に で呼び出した場合n < 1n < 0は最大 1 回の再帰呼び出しの後で同じものを返すようにし、n = 1すぐに を返しますcons(1,null)

last呼び出しで null でないときはいつでも、それを使用する必要があります。

于 2012-02-04T16:00:15.737 に答える