在递归函数中重新排序匹配子句

时间:2018-02-14 10:40:05

标签: algorithm recursion optimization ocaml

我在学校有一些Ocaml课程,为了练习,我们必须编写函数长度。

我的老师向我们展示了Xavier Leroy如何编写他的功能:

@Service
public class MyService {
...
    private CloseableHttpClient closeableHttpClient;

    public String setPayment() {
...
        try {
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader(ACCEPT, APP_JSON);
            httpPost.setHeader(CONTENT_TYPE, APP_JSON);
            StringEntity entity = new StringEntity(request, CHARSET);
            httpPost.setEntity(entity);
            CloseableHttpResponse response = closeableHttpClient.execute(httpPost);
            logger.info("Execution");
        } catch (IOException e) {
            logger.error("Error");
        }
    }
}

当我的老师向我们解释为什么他会做这样的长度函数时,他说他不知道为什么Xavier Leroy不写:

let rec length_aux len = function
   [] -> len
 | a::l -> length_aux (len + 1) l

let length l = length_aux 0 l

...为了使它更快(因为大多数情况下列表都是非空的)。

所以,如果有人知道为什么第二个并不比第一个更好,你能回答我吗?

谢谢。

1 个答案:

答案 0 :(得分:5)

对于OCaml,这是相同的功能。模式匹配将被编译为测试列表是否为空,并跳转到一侧或另一侧。

C中的类似代码将在switch语句中重新排序案例。