Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >两个连续递归调用OCaml

两个连续递归调用OCaml
EN

Stack Overflow用户
提问于 2018-10-05 10:26:21
回答 2查看 573关注 0票数 1

我的职能如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let extract n l =
    let rec aux acc pro = function
         |[]   -> acc
         |a::b -> if (List.length pro) = n then aux (pro::acc) [] (a::b) else aux acc (a::pro) b; aux acc (pro) b
    in aux [] [] l

正如您在我的模式匹配中所看到的,在第二个测试的情况下,我调用了函数的两倍。有可能吗?

因此,有可能具有这样的功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let rec some_function = function
   | [] ->[]
   | a::b -> some_function b; some_function b (*so I am calling two times the function in a single test*)

我提出这个问题,是因为我在这里有以下警告:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
File "main.ml", line 4, characters 48-72:
Warning 10: this expression should have type unit.

因此,在我调用两次递归函数的确切位置有一个问题。这可能是因为我使用的是;,但在这种情况下,我如何分离这两个调用?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-05 11:22:57

若要添加到FlorianWeimer的答案,请提供有关您的错误消息的一些信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Warning 10: this expression should have type unit.

OCaml是强类型的。因此,如果一个函数返回一个整数或一个列表,而你没有对它做任何事情,它会想知道发生了什么,并警告你。

print_int 5;这样的函数调用返回(),它的类型是unit。这基本上意味着它什么也不返回,因为你不是调用它来计算什么,而是做一些事情。它已经做了那件事,现在它回来了,你继续前进。

但是像float_of_int 5;这样的函数调用,它返回一个值(浮点5.0)。你(可能)不是叫它做某事,而是为了计算某事,它返回的是你感兴趣的东西。像3+6;这样的算术表达式也是如此,10;"abc";[];等直接向上的值也是如此。

这就是为什么,如果您编写其中一个有值而不使用该值(在赋值中,或作为另一个函数的参数),OCaml警告您。它告诉你“我计算了一些我没有分配的东西,没有返回,也没有用它作为其他东西的参数。通常,unit类型的东西是唯一这样的东西。你确定你的代码中没有错误吗?”

有时候你知道你在做什么,你不想听到这样的警告。在这种情况下,您可以调用ignore函数。ignore会拿走任何东西而忽略它,返回()。例如,ignore 5;ignore (float_of_int 10);不会抛出您将在5;float_of_int 10;中得到的“这个表达式应该有类型单元”警告。

票数 1
EN

Stack Overflow用户

发布于 2018-10-05 10:36:37

从编译器接受它的意义上来说,这是可能的,但只有当您对结果做了一些事情(或者该函数有副作用)时,它才有意义。两个函数调用的典型示例是Fibonacci序列的递归计算:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let rec fib = function
  | 0 -> 0
  | 1 -> 1
  | n -> fib (n - 1) + fib (n - 2)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52671366

复制
相关文章
递归调用
一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。 递归必须是有推出条件的,如果没有,将会一直递下去,没有归。造成内存溢出崩溃。 先写一个简单的递归函数
用户7272142
2023/10/11
1910
递归调用
js 递归调用
最近在做一个复杂表格设计数据格式设置,其中用到了多叉树的原理,所以要用到递归来实现数据格式化。
夜尽天明
2019/11/13
18.9K0
js 递归调用
Java递归写法_java递归调用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/02
1.6K0
The OCaml Language Cheatsheets
Implementations are in .ml files, interfaces are in .mli files. Comments can be nested, between delimiters (*...*) Integers: 123, 1_000, 0x4533, 0o773, 0b1010101 Chars: 'a', '\255', '\xFF', '\n' Floats: 0.1, -1.234e-34
绿巨人
2020/04/09
5110
oracle存储过程递归调用_函数的间接递归调用
注意:递归存储过程一般会用到 output 或 return,两者返回值类型上有一定的区别,output 基本上没有限制,但 return 返回的一般是 int 类型。
全栈程序员站长
2022/11/09
1.4K0
oracle存储过程递归调用_函数的间接递归调用
递归尾调用优化
尾调用(Tail Call)是函数式编程的一个重要概念,就是指某个函数的最后一步是return调用另一个函数。
wade
2020/04/24
6950
Java递归调用_递归算法1加到100
1)各种数学问题如: 8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题 (google编程大赛)
全栈程序员站长
2022/09/28
6950
C语言进阶递归调用
我们先来了解一下什么是递归?递归(recursion):即程序调用自身的一个编程技巧。首先,递归需要满足以下2个条件:
老九学堂-小师弟
2019/09/19
2.1K0
6.4 嵌套和递归调用
C语言标准c89和c99中并不支持函数嵌套功能,它是GUN C的一个拓展,所以在gcc中是可以支持函数嵌套的
小林C语言
2019/08/19
6620
尾调用和尾递归
尾调用是函数式编程中一个很重要的概念,当一个函数执行时的最后一个步骤是返回另一个函数的调用,这就叫做尾调用。
leocoder
2018/10/31
1.1K0
有点意思的 Java 递归调用
这行代码 inputText.charAt(inputText.length() - 1) 将会返回你输入字符串的最后一个字符。
HoneyMoose
2023/09/01
1370
有点意思的 Java 递归调用
C++ 函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归(recursive)调用。包含递归调用的函数称为递归函数。 比如:
chaibubble
2022/05/07
1.2K0
C++ 函数的递归调用
python生成器,递归调用
什么是生成器:只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器
py3study
2020/01/20
1.1K0
Oracle 递归sql,mybatis的递归查询,与存储过程调用
引用文献:https://www.cnblogs.com/Soprano/p/10659127.html
斯文的程序
2019/11/07
1K0
Java方法的嵌套与递归调用
方法嵌套的概念其实比较好理解,就是在调用方法的过程中又遇到了方法的调用,在刚开始接触的时候虽然在逻辑上能够理解为什么运行结果是这样的,但是对于代码执行的过程还是感觉有些绕。
一头小山猪
2020/04/08
2.5K0
Java方法的嵌套与递归调用
android 两个APK调用
@Override     public boolean onTouchEvent(MotionEvent event) {          ComponentName componetName = new ComponentName(                  //这个是另外一个应用程序的包名                 "com.apk2",                 //这个参数是要启动的Activity                 "com.apk2.MainActivity"); //        Intent intent= new Intent("chroya.foo");         Intent intent= new Intent();         //我们给他添加一个参数表示从apk1传过去的         Bundle bundle = new Bundle();         bundle.putString("arge1", "这是跳转过来的!来自apk1");         intent.putExtras(bundle);         intent.setComponent(componetName);         startActivity(intent);         return super.onTouchEvent(event);     }
用户2192970
2019/02/21
4400
Flink: 两个递归彻底搞懂operator chain
operator chain是指将满足一定条件的operator 链在一起,放在同一个task里面执行,是Flink任务优化的一种方式,在同一个task里面的operator的数据传输变成函数调用关系,这种方式减少数据传输过程。常见的chain例如:source->map->filter,这样的任务链可以chain在一起,那么其内部是如何决定是否能够chain在一起与chain一起之后如何执行就是本篇文章将要剖析的重点。
Flink实战剖析
2022/04/18
1.1K0
Flink: 两个递归彻底搞懂operator chain
函数(五)(函数的嵌套与递归调用)
C语言的函数定义是互相平行和独立的,但函数的调用是可以嵌套的,也就是说,在调用一个函数的过程中,又去调用另外一个函数。
pigeon
2022/04/11
1.6K0
函数(五)(函数的嵌套与递归调用)
点击加载更多

相似问题

Ocaml:再次调用递归函数

11

OCaml中的递归调用

10

Ocaml函数调用,递归地调用自己

15

if expression - ocaml中的递归调用

11

Ocaml递归

17
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文