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