这是我到目前为止所拥有的。
我们可以使用从堆的根开始的递归算法(因为根是最大数。然后我们将检查我们的 X(我们正在寻找的)是否大于我们的根。如果 X 大于我们停止根。如果没有,我们打印根,然后检查它的左子节点和右子节点。依此类推...
这是一个好的算法吗?我的算法在最坏情况下的时间复杂度是否为 O(N),其中 N 是堆中的节点数。
我有这个功能由我的教授给出,我不知道实际发生了什么.
这是计算m-by-n矩阵的转置的函数:
let rec transpose = function
| [] -> failwith "cannot transpose a 0-by-n matrix"
| []::xs -> []
| xs -> List.map List.head xs :: transpose (List.map List.tail xs)
Run Code Online (Sandbox Code Playgroud)
测试功能:
> transpose [[1;2;3];[4;5;6]];;
val it : int list list = [[1; 4]; [2; 5]; [3; 6]]
Run Code Online (Sandbox Code Playgroud)
我理解List.map,递归和所有这些东西.我只是不明白为什么/这个功能如何工作.任何澄清将非常感谢!谢谢!
我有一个功能,将列表分成两半.
这是功能:
let rec split = function
| [] -> ([],[])
| [a] -> ([a],[])
| a::b::cs -> let (M,N) = split cs
(a::M, b::N)
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么这个陈述有效(a::M, b::N).在执行该语句之前,我们不是在调用递归函数吗?那个声明不应该被执行吗?