所以我在大学学习 Ocaml,今年我们创建的代码有一些特殊的规则:没有循环或数组(我不知道为什么,但当我的一个朋友在考试中使用它们时,她几乎看起来很生气)所以我们必须处理仅递归的问题,在这里我必须创建一个代码来返回 (0,2) 和 (n,n+2) 之间的所有孪生素数,例如 3,5 5,7 或 11,13 所以我尝试这样做就这样:
let rec calculpj p q n =
if q = p + 2 && n > 0 then begin
if q mod p != 0 && p mod q != 0 then begin
print_int(p) ;
print_int(q) end
else calculpj (p + 1) (q + 1) (n - 1) end
else calculpj (p + 1) (q + 1) (n - 1) ;;
calculpj 3 5 3
但出于某种原因,我无法理解为什么最后一个“else”不使用新值重新启动递归,因为第一个“循环”按预期返回值。 如果有人想知道这个练习来自哪里,那就是来自一次考试,老师没有给我们答案,所以我没有任何东西可以纠正自己。
我尝试了很多方法,但由于我是 Ocaml 新手,我不知道如何找到导致问题的原因。
您有几个案例。其中之一是:
begin
print_int(p) ;
print_int(q)
end
这涵盖了两个
mod
值不为 0 的情况。请注意,这种情况到此为止。打印这两个int后就没有什么可做的了。这就是为什么您的代码在第一次后停止的原因。对 calculpj
的两次递归调用适用于其他情况。