以递归方式检查给定int的每个数字是否小于“base”。
在“伪代码”中
boolean is_base ( int base, int num)
{
if num = 0
return true;
else if num mod 10 < base
is_base (base, num/10)
else return false
}
Ocaml代码
let rec is_base base num=
if num = 0 then 1
else if num mod 10 < base then is_base base num/10
else 0
是一个循环递归。
答案 0 :(得分:2)
函数应用程序运算符(在OCaml中只是函数及其参数的并置,例如f x
)具有比算术运算符更高的优先级(即,它更紧密地绑定),因此OCaml将f x/10
表达式视为(f x) / 10
。
在您的情况下,is_base base num/10
被解析为(is_base base num)/10
,即,首先使用base
和num
参数进行递归调用,然后将结果除以{{ 1}}。由于您的递归调用始终使用相同的参数,因此它永远不会终止。
此外,如果您使用10
代表布尔值(即bool
和true
),编译器会告诉您代码不正确。始终使用最具体的类型,这将有助于编译器提供更好的诊断。
答案 1 :(得分:0)
(你的代码有点像移动目标......)
您无需在显示的代码中更改num
。您可以在不更改num / 10
的情况下传递num
。
一般来说,这是编写功能代码的方法。您通常认为是可变值的内容将成为函数参数。