【发布时间】:2017-01-16 19:14:37
【问题描述】:
我发誓这不是作业问题。我已经几十年没上课了。曾几何时,我想出了一个可爱的分区函数递归公式:
/ 0 (k > n)
f(k, n) { 1 (k = n)
\ p(k, n-k)+p(k+1, n) (k < n)
我想尝试在序言中表示这一点。这是我所能得到的:
partition(N, N, 1) :- !. %% http://stackoverflow.com/a/9582409
partition(K, N, 0) :- K > N.
partition(K, N, A+B) :-
X is K+1,
Y is N-K,
partition(X, N, A),
partition(K, Y, B).
?- partition(1, 10, X). 给了我这个:
X = 1+0+0+0+0+1+(1+0+0)+(1+0+0+0+(1+0))+(1+0+0+0+ 1+(1+0+0)+(1+0+0+1+(1+0+1)))+(1+0+0+0+0+(1+0)+(1+0) +0+1)+(1+0+0+0+(1+0)+(1+0+0+(1+0)))+(1+0+0+0+1+(1+ 0+0)+(1+0+0+1+(1+0+1))+(1+0+0+0+(1+0)+(1+0+0+(1+0) )+(1+0+0+1+(1+0+1)+(1+0+0+(1+0)+(1+0+1+(1+0+(1+1)) )))))) ?
令人欣慰的是,上面的表达式中确实有 42 个 (?)。我希望X=42. 注意问号。是的,有更多匹配项(显然更多)。第二个是:
X = 1+0+0+0+0+1+(1+0+0)+(1+0+0+0+(1+0))+(1+0+0+0+ 1+(1+0+0)+(1+0+0+1+(1+0+1)))+(1+0+0+0+0+(1+0)+(1+0) +0+1)+(1+0+0+0+(1+0)+(1+0+0+(1+0)))+(1+0+0+0+1+(1+ 0+0)+(1+0+0+1+(1+0+1))+(1+0+0+0+(1+0)+(1+0+0+(1+0) )+(1+0+0+1+(1+0+1)+(1+0+0+(1+0)+(1+0+1+(1+(0+0)+(1) +1))))))))?
【问题讨论】:
-
Prolog 不会在您的
partition(K, N, A+B)子句头中评估A+B。这只是 Prolog 中的一个术语。你需要partition(K, N, R) :- ... , R is A + B.
标签: recursion prolog number-theory