我发现这是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
请帮我解决这个问题。
答案 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。
答案 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 ...