2016-10-04 9 views
0

私は線形再帰トリプルフィボナッチ(トリプルフィボナッチ数はフィボナッチ数に影響されますが、3つの既定値から始まり、その後の各値は前の3つの値の合計です。 )Javaでの線形再帰を使用したトリプルフィボナッチ

制約の一つは、それが末尾再帰にするために、基本的ですが、これまでのところ、私は、コードのこの部分を持つ任意のチャンスを持っていなかった。

public class TailRecursiveOddonacci { 

public long tailOddonacci(int n) { 
    if (n <= 3) { 
     return 1; 
    } 
    return tailOddonacciRecursion(0, 1, 2, n); 
} 

private long tailOddonacciRecursion(int a, int b, int c, int count) { 
    if(count <= 0) { 
     return a; 
    } 
    return tailOddonacciRecursion(b, a+b, a+b+c, count-1); 
} 
} 

私は苦労理由を見つけるのを持っていますそれは動作していません...

EDIT:この場合のnは負でない整数です。したがって、たとえば、10が105を返すことになっている、または5は、あなたの編集に基づいて5

+0

がどのようにこのコードを呼び出していますか? 'n 'の値は? –

+0

@manetsusはまだ動作しません... 10としてnは私を与えています34 – lesterpierson123

答えて

5

EDIT を返すことになっている、今私は、所定の値がすべて1

  1. されるべきだと思うあなたのオーバーロードへの最初の呼び出しは0,1,2を渡しましたが、1,1,1を渡す必要があります。
  2. 再帰呼び出しが間違っています。各パラメータを左にシフトし、新しいパラメータをa + b + cに渡す必要があります。
  3. 最初の呼び出しでn - 3を過負荷に渡してから、cをベースケースに戻すことで、余分なステップを計算することを避けることができます。上記のコードによると、最初の10個の数字ここ

    public long tailOddonacci(int n) { 
        if (n <= 3) { 
         return 1; 
        } 
        return tailOddonacciRecursion(1, 1, 1, n - 3); 
    } 
    
    private long tailOddonacciRecursion(int a, int b, int c, int count) { 
        if(count <= 0) { 
         return c; 
        } 
        return tailOddonacciRecursion(b, c, a + b + c, count - 1); 
    } 
    
    public static void main(String[] args) { 
        System.out.println(new Test().tailOddonacci(5)); 
    } 
    

    されています:

は、以下の作業コードを参照してください

1, 1, 1, 3, 5, 9, 17, 31, 57, 105 
+0

編集:それは動作します! – lesterpierson123

+0

こんにちは!これをリバンプして申し訳ありませんが、tailOddonacci(10)は実際には105ではなく193になる必要があります。 (次の値)、私はこれをどのようにすることができるのかを私に説明してもらえますか? – lesterpierson123

+0

@ lesterpierson123その前に9は何ですか? – smarx

関連する問題