zoukankan      html  css  js  c++  java
  • 几个简单函数的实现,就当做是ocaml练习用的

    第一个函数式求和,从i到j求和,这里假定i是下限,j是上限

    let rec sum i j =

      if i > j then 0

      else i + (sum (i+1) j) ;;

    这个递归实现很简单,但是由于不是尾递归的,所以编译器不能转成迭代来计算,当递归层数太高

    的情况下stack会溢出,稍微修改一下,可以改成递归版本

    let sum i j =

      let rec sum_int i j s =

        if i > j then s

        else sum_int (i+1) j (s+i)

      in

      sum_int i j 0 ;;


    这里定义了一个sum_int的内部函数,他是一个尾递归的函数,编译器会转成迭代来计算。

    这里简单求和看起来没啥用处,进一步我们可以推广到求和\sum_{k=i}^j f(k),只要简单修改

    一下sum的定义,加入一个f的参数,可以得到

    let sum f i j =

      let rec sum_int f i j s =

        if i > j then s

        else sum_int f (i+1) j (s + f i)

      in

      sum_int f i j 0;;

    这里可以看出,区间的遍历我们是使用+,结果的累积是使用+,空集对应的结果是0,这些其实可以进一步的泛化,

    从而得到更加一般的求和。

  • 相关阅读:
    JS开发技巧
    Git push 常见用法
    关闭浏览器标签
    vue 样式穿透 watch深度监听
    Git Commit Template 提交模板
    常用git stash命令:
    Windows下安装及使用NVM
    JS正则表达式
    js转码
    多行文本溢出显示省略号(…)全攻略
  • 原文地址:https://www.cnblogs.com/mathlover/p/2786256.html
Copyright © 2011-2022 走看看