在tribonacci系列中找到第n个元素

时间:2014-12-23 06:23:48

标签: c#

我发现这是Microsoft interview question(See Round 4)。我正在尝试使用C#解决它。 我的尝试

private static int NTerm_Tribonacci(int term)
        {
            int a = 0;
            int b = 1;
            int c = 1;
            int result = 0;
            if (term == 1) return a;
            if (term == 2) return b;
            if (term == 3) return c;

            for (int i = 4; i <= term; i++)
            {
                a = a + b + c; if ((1 + 3 * i) % term == 0) { result = a; break; }
                b = a + b + c; if ((2 * i + i - 1) % term == 0) { result = b; break; }
                c = a + b + c; if ((3 * i) % term == 0) { result = c; break; }
            }
            return result;           
        }

但它在某种程度上不起作用var res = NTerm_Tribonacci(5); //应该是4但是得到44

请帮我解决这个问题。

Tribonacci Number

3 个答案:

答案 0 :(得分:2)

试试这个:

private static int NTerm_Tribonacci(int term)
    {
        int a = 0;
        int b = 1;
        int c = 1;
        int result = 0;

        if (term == 0) result = a;
        if (term == 1) result = b;
        if (term == 2) result = c;

        while(term > 2)
        {
            result = a + b + c;
            a = b;
            b = c;
            c = result;
            term--;
        }

        return result;           
    }

请注意,根据链接中的定义,我假设第一个术语是T0,而不是T1。

Demo

答案 1 :(得分:1)

我喜欢&#34; LINQ方式&#34;解决这些问题:

    public IEnumerable<long> InfiniteTribonacciSequence()
    {
        long a = 0, b = 1, c = 1;
        long nextTerm;

        yield return a;
        yield return b;
        yield return c;

        while (true)
        {
            nextTerm = a + b + c;
            yield return nextTerm;

            a = b;
            b = c;
            c = nextTerm;
        }
    }

但必须谨慎使用,因为像Min()这样的方法会因此而疯狂。但你可以使用例如InfiniteTribonacciSequence.Take(5).Last()获取序列的第5个元素。

答案 2 :(得分:0)

我认为递归方式太适合这种情况:

示例:

using System.IO;
using System;

class Program
{
    static void Main()
    {

        int a=4, b;
        b=tribo(a);
        Console.WriteLine(b);
    }

    static public int tribo(int n)
    {
        if(n==0) return 0;
        if(n==1) return 1;
        if(n==2) return 1;
        return(tribo(n-1)+tribo(n-2)+tribo(n-3));
    }
}

这给出了系列0 1 1 2 4 7 13 24 ...