C# Tribonaci序列

C# Tribonaci序列,c#,C#,我试图解决: 公共类Xbonacci { 公共双[]Tribonaci(双[]签名,整数n) { 双[]r={0}; 如果(n==0) { 返回r; } 列表t=新列表(); for(int i=0;i 让rec循环到i列表= 第一场比赛 |i、 当i[List.take len y |>List.sum]@aList |>循环到(i+1)时为y |_->主义者 List.rev x |>循环一个len |>List.rev 首先,对于n==0,您返回了错误的答案:您返回的数组包含一个值为零的元

我试图解决:

公共类Xbonacci
{
公共双[]Tribonaci(双[]签名,整数n)
{
双[]r={0};
如果(n==0)
{
返回r;
}
列表t=新列表();
for(int i=0;i

它可以通过给定的测试,但我仍然无法通过最终检查。有任何指针指出我做错了什么吗?

请注意,代码中的注释(对于
c
)是不正确的,因为它说如果
n==0,则返回长度为1的数组。令人困惑,但正确的返回值是空数组,如指令集和op发布的问题注释中所指定

正如您所说的,问题是您需要在
n
迭代之后返回
signature
,因此在单个迭代之后,检查需要长度为1的数组

用python回答:

def tribonacci(signature, n):
    if n == 0:
        return []

    next_sum = 0

    for i in range(len(signature)):
        next_sum += signature[i]

    return  signature[:-2] + tribonacci(signature[-2:] + [next_sum], n-1)
或使用列表:

def tribonacci(signature, n):
    if n == 0:
       return []
    return signature[:-2] + tribonacci(signature[-2:] + [sum([ e for e in signature ])], n-1)

既然你弄明白了,我就把我的解决方案放进去

我创建了一个helper函数来返回tribonaci的无限序列,然后在所需的函数中使用它

using System.Collections.Generic;
using System.Linq;

public class Xbonacci {
  public double[] Tribonacci(double[] signature, int n) {
    // hackonacci me
    // if n==0, then return an array of length 1, containing only a 0
    if (n == 0)
        return new double[] { 0 };
    else
        return Tribonacci(signature).Take(n).ToArray();
  }

  public IEnumerable<double> Tribonacci(double[] signature) {
      foreach (var n in signature)
          yield return n;

      var buffer = new Queue<double>(signature);
      while (true) {
          var next = buffer.Sum();
          yield return next;
          buffer.Dequeue();
          buffer.Enqueue(next);
      }
  }
}

这里是F#中的一个广义解,它接受任意长度的签名列表。产出的例子: 1) “genBonacci[1;1]10:[1;1;2;3;5;8;13;21;34;55](标准斐波那契); 2) “genBonacci[1;1;2]10:[1;1;2;4;7;13;24;44;81;149](一个Tribonacci); 3) “genBonacci[1;1;2;0]10:[1;1;2;0;4;7;13;24;48;92](一个“四”字的bonacci)

让genBonacci(符号:int list)n=
设len=List.length符号
匹配,签名
|_,[]->[]
|a、 当你打个x时
|a、 x->
让rec循环到i列表=
第一场比赛
|i、 当i[List.take len y |>List.sum]@aList |>循环到(i+1)时为y
|_->主义者
List.rev x |>循环一个len |>List.rev

首先,对于
n==0
,您返回了错误的答案:您返回的数组包含一个值为零的元素,而不是一个空数组。@NetMage指令说返回长度为1且元素为0的数组,对吗?话虽如此。。。我不认为OP使用的声明是有效的
c 35;
,令人惊讶的是它居然有效。我希望类似这样:
var r=newint[]{0}
@mad.meesh No
如果n==0,则返回空数组
。这是一个内联集合initializer@NetMage .. 啊,你说得对。我正在阅读代码中的注释,这与实际的说明不同!有趣的是,我以前没有遇到过这种语法,但很酷。谢谢。似乎说明中说返回一个空数组,但注释中说返回一个长度为1且元素为0的数组,测试需要注释中的内容。这取决于您是否希望提交代码,因为完整测试需要一个数组在传递时具有单个零,正如注释指定的那样,而不是按照指令指定的那样。hmm。。这必须是针对
c35;
的,因为我能够通过测试套件,返回一个空数组,但通过一个长度为1且0的数组,第一次测试失败。奇怪,很好!我同意返回空数组是正确的方法。。。顺便说一句,如果
n
是1还是2,你的列表理解版本有效吗?我喜欢
buffer
技术!在
签名
中移动数组元素可能更有效,但如果你不能使用奇特的类型,中级语言又有什么用呢?同意。但如果效率是我们追求的目标,那么我们不妨在工作的同时做一些记录
using System.Collections.Generic;
using System.Linq;

public class Xbonacci {
  public double[] Tribonacci(double[] signature, int n) {
    // hackonacci me
    // if n==0, then return an array of length 1, containing only a 0
    if (n == 0)
        return new double[] { 0 };
    else
        return Tribonacci(signature).Take(n).ToArray();
  }

  public IEnumerable<double> Tribonacci(double[] signature) {
      foreach (var n in signature)
          yield return n;

      var buffer = new Queue<double>(signature);
      while (true) {
          var next = buffer.Sum();
          yield return next;
          buffer.Dequeue();
          buffer.Enqueue(next);
      }
  }
}
  public double[] Tribonacci(double[] signature, int n) => Tribonacci(signature).Take(n).ToArray();
let genBonacci (sign:int list) n = 
    let len = List.length sign
    match n,sign with
    |_,[]->[]
    |a,x when a<1+len->List.take a x
    |a,x->
        let rec loop upTo i aList =
            match i,aList with
            |i,y when i < upTo-> [List.take len y |> List.sum]@aList |> loop upTo (i+1)
            |_->aList
        List.rev x |> loop a len |> List.rev