Ocaml - 检查给定int的每个数字是否递归地小于“base”

时间:2018-03-09 18:39:43

标签: functional-programming ocaml

以递归方式检查给定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

是一个循环递归。

2 个答案:

答案 0 :(得分:2)

函数应用程序运算符(在OCaml中只是函数及其参数的并置,例如f x)具有比算术运算符更高的优先级(即,它更紧密地绑定),因此OCaml将f x/10表达式视为(f x) / 10

在您的情况下,is_base base num/10被解析为(is_base base num)/10,即,首先使用basenum参数进行递归调用,然后将结果除以{{ 1}}。由于您的递归调用始终使用相同的参数,因此它永远不会终止。

此外,如果您使用10代表布尔值(即booltrue),编译器会告诉您代码不正确。始终使用最具体的类型,这将有助于编译器提供更好的诊断。

答案 1 :(得分:0)

(你的代码有点像移动目标......)

您无需在显示的代码中更改num。您可以在不更改num / 10的情况下传递num

一般来说,这是编写功能代码的方法。您通常认为是可变值的内容将成为函数参数。