我的最终目标是将python中的以下代码转换为C#,但我想通过学习python语法来实现自己.我知道代码是递归的.
该代码产生具有k个变量的n次多项式.更具体地说,每个变量的指数列表.
def multichoose(n,k):
if k < 0 or n < 0: return "Error"
if not k: return [[0]*n]
if not n: return []
if n == 1: return [[k]]
return [[0]+val for val in multichoose(n-1,k)] + \
[[val[0]+1]+val[1:] for val in multichoose(n,k-1)]
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的转换:
public double[] MultiChoose(int n, int k)
{
if (k < 0 || n < 0)
{
throw new Exception();
}
if (k == 0)
{
return [[0]*n]; // I have no idea what the [[0]*n] syntax means
}
if (n == 0)
{
return new double[0]; // I think this is just an empty array
}
if (n == 1)
{
return new double[1] {k}; // I think this is just an empty array
}
//Part I don't understand
return [[0]+val for val in MultiChoose(n-1,k)] + \
[[val[0]+1]+val[1:] for val in MultiChoose(n,k-1)]
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何转换python代码?
我会在 C# 中使用LINQ来翻译代码:
[]是空列表。
Enumerable.Empty<T>()
Run Code Online (Sandbox Code Playgroud)[x]是包含单个项目 x 的列表。
Enumerable.Repeat(x, 1)
Run Code Online (Sandbox Code Playgroud)[[0]*n]是包含 n 个 0 副本的列表的列表。
Enumerable.Repeat(Enumerable.Repeat(0, n), 1)
Run Code Online (Sandbox Code Playgroud)[X for Y in Z]是一个列表理解。
from Y in Z select X
- or -
Z.Select(Y => X);
Run Code Online (Sandbox Code Playgroud)X + Y(其中 X 和 Y 是列表)是列表串联。
Enumerable.Concat(X, Y)
Run Code Online (Sandbox Code Playgroud)MultiChoose 的签名为:
public IEnumerable<IEnumerable<double>> MultiChoose(int n, int k);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |