不知道为什么
k
在代码中从0开始,在公式中从1开始。还有为什么代码会说
s (n2-(!k))
当公式成立时
s (n-(!k)-1)
?
你的代码就是你在计算
s(n2-(!k))
对于
n2 = n - 2
,但公式上说应该计算
s(n-(!k)-1)
对于
n
本身,而不是
n-2
.你的代码最终会计算
s (n-(!k)-2)
,减去2而不是1。但你也要从
k=0
(可能是为了补偿减去2的损失?),但这导致了计算
s 0
而不是
s 1
对于产品中的第一个术语,
s 1
而不是
s 2
等
看起来这可以在没有循环或循环的情况下实现
ref
:
let rec s n =
(* Same as your code *)
match n with
| 0 -> 1
| 1 -> 2
| _ -> 3 * (s (n-1)) + (sum_s n) (* `n` here! *)
and
sum_s n =
let rec sum_s_impl (n, k) =
(* Implement the formula *)
if (n-2 < 1) || (k > n-2) then 0
else (s k) * (s (n-k-1)) + (sum_s_impl (n, k+1))
in sum_s_impl (n, 1);;
for n = 0 to 10 do
print_int (s n);
print_newline ()
done;;
输出:
$ ocaml code.ml
1
2
6
22
90
394
1806
8558
41586
206098
1037718
这似乎与OEIS在
https://oeis.org/A006318
.