函数nth必须像这样工作:
# nth [1;2;3;4;5] 0;;
- : int = 1
# nth [1;2;3;4;5] 1;;
- : int = 2
# nth [1;2;3;4;5] 2;;
- : int = 3
# nth [1;2;3;4;5] 3;;
- : int = 4
我写了这个名为nth的函数:
let rec nth l n =
match l with
|[] -> raise (Failure "list is too short")
|hd::tl ->
if n > 0 then nth tl n-1 else hd
所以我键入nth [1;2;3;4;5] 3
,预期输出为4,但控制台说“列表太短”
我期望的算法是这样的: nth [1; 2; 3; 4; 5] 3
1::[2;3;4;5] 3 > 0 is true, so nth [2;3;4;5] 2 is called.
2::[3;4;5] 2 > 0 is true, so nth [3;4;5] 1 is called.
3::[4,5] 1 > 0 is true, so nth [4;5] 0 is called
4::[5] 0 > 0 is false, so return 4
so nth [1;2;3;4;5] 3 = 4
我的代码出了什么问题?
答案 0 :(得分:3)
这是一个优先问题。表达式nth tl n-1
的解析方式如下:(nth tl n) - 1
。你需要这样的括号:nth tl (n - 1)
。
如果您使用字符串列表(例如)尝试当前代码,您将从顶层获得可能更有用的错误消息。
除了这个问题,你的代码看起来很棒。