所以我有这个公式:
P(n, 1) = P(n, n) = 1
P(n + k, k) = P(n, 1) + P(n, 2) + ... + P(n, k)
但我不明白。
我写错了吗?
我不明白为什么n+k
P(n + k, k)
”
假设P是一个函数,我调用P(6, 2)
。 P(n + k, k)
做了什么?它会转换为P(8, 2)
还是P(4 + 2, 2)
...
我不明白它是如何运作的,也许如果有人给我一个例子,一步一步......
答案 0 :(得分:1)
两个公式线是数学定义,而不是编程算法。希望他们提供足够的信息,以便您可以找到任何P(x,y)
的价值。
由于第一行有效地定义了两种不同的情况,我想重写公式:
(A) P(n, 1) = 1
(B) P(n, n) = 1
(C) P(n + k, k) = P(n, 1) + P(n, 2) + ... + P(n, k)
因此,如果您要将它们应用于P(6,2)
,那么只有(C)
可以匹配,因为(A)
仅匹配P(6,1)
和(B)
之类的内容像P(6,6)
这样的东西。
P(6,2)
与P(n+k,k)
的匹配意味着k
必须是2
,而n+k
必须是6
,这意味着n=4
}}
然后(C)
的右侧展开为P(4,1) + P(4,2)
。它的第一部分与(A)
匹配,第二部分与(C)
匹配。因此,第一部分提供1
,第二部分必须以与P(6,2)
相同的方式进行扩展。等等...
如果要实现计算P(x,y)
值的函数,那么直接的方法是将定义公式转换为递归计算。
答案 1 :(得分:0)
嗯,你必须一次又一次地应用公式 :
P(6, 2) = P(4 + 2, 2) = P(4, 1) + P(4, 2)
现在P(4, 1)
我们有
P(4, 1) = P(3 + 1, 1) = P(3, 1) = P(2 + 1, 1) = P(2, 1) = P(1 + 1, 1) = P(1, 1) = 1
借助归纳,我们可以在P(N, 1) = 1
N >= 1
P(4, 2)
我们有
P(4, 2) = P(2 + 2, 2) = P(2, 2) + P(2, 1) = 1 + P(2, 1) =
= 1 + P(1 + 1, 1) = 1 + P(1, 1) = 1 + 1 = 2
最后
P(6, 2) = P(4 + 2, 2) = P(4, 1) + P(4, 2) = 1 + 2 = 3
一般情况下(再次归纳)P(2 * N, 2) = N
最简单的 C#实现(对于某些输入不起作用,例如P(0, 1)
):
private static Dictionary<Tuple<int, int>, int> s_Cached =
new Dictionary<Tuple<int, int>, int>();
private static int P(int n, int k) {
if (n == k)
return 1;
if (s_Cached.TryGetValue(new Tuple<int, int>(n, k), out var value))
return value;
int result = 0;
for (int i = 1; i <= k; ++i)
result += P(n - k, i);
s_Cached.Add(new Tuple<int, int>(n, k), result);
return result;
}
测试
Console.WriteLine(P(6, 2));