小编nam*_*ame的帖子

一种在二元最大堆中查找大于某个值 X 的所有节点的算法

这是我到目前为止所拥有的。

我们可以使用从堆的根开始的递归算法(因为根是最大数。然后我们将检查我们的 X(我们正在寻找的)是否大于我们的根。如果 X 大于我们停止根。如果没有,我们打印根,然后检查它的左子节点和右子节点。依此类推...

这是一个好的算法吗?我的算法在最坏情况下的时间复杂度是否为 O(N),其中 N 是堆中的节点数。

algorithm

4
推荐指数
1
解决办法
1925
查看次数

这个转置功能如何工作?

我有这个功能由我的教授给出,我不知道实际发生了什么.

这是计算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,递归和所有这些东西.我只是不明白为什么/这个功能如何工作.任何澄清将非常感谢!谢谢!

f#

4
推荐指数
1
解决办法
632
查看次数

为什么这个分离功能有效?

我有一个功能,将列表分成两半.

这是功能:

  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).在执行该语句之前,我们不是在调用递归函数吗?那个声明不应该被执行吗?

recursion f#

3
推荐指数
1
解决办法
69
查看次数

标签 统计

f# ×2

algorithm ×1

recursion ×1