Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 我应该使用循环吗?_Loops_Recursion_Functional Programming_Tail Recursion_Ml - Fatal编程技术网

Loops 我应该使用循环吗?

Loops 我应该使用循环吗?,loops,recursion,functional-programming,tail-recursion,ml,Loops,Recursion,Functional Programming,Tail Recursion,Ml,我学习ML中的函数式编程已经有一段时间了 专注于递归和尾部递归的定义。 几乎(更确切地说)我用其他语言编写的每个循环都编写了尾部递归函数。 我应该继续这样做,还是会让我未来的同龄人感到困惑 是用ML(或Ocaml)语言(或Scheme,甚至是最常见的Lisp)编写“循环”的正确方法,但遗憾的是,没有迭代构造的Lisp) 例如,以标准库的源代码为例(例如Ocaml) 尾部rec呼叫不会让你的同龄人感到困惑,他们对此很熟悉 顺便说一句,您还可以感觉到过程语言(例如C、Java或C++)中的普通循环是

我学习ML中的函数式编程已经有一段时间了 专注于递归和尾部递归的定义。 几乎(更确切地说)我用其他语言编写的每个循环都编写了尾部递归函数。 我应该继续这样做,还是会让我未来的同龄人感到困惑

是用ML(或Ocaml)语言(或Scheme,甚至是最常见的Lisp)编写“循环”的正确方法,但遗憾的是,没有迭代构造的Lisp)

例如,以标准库的源代码为例(例如Ocaml)

尾部rec呼叫不会让你的同龄人感到困惑,他们对此很熟悉

顺便说一句,您还可以感觉到过程语言(例如C、Java或C++)中的普通循环是严重隐藏的尾部递归调用。这是一个意见问题

顺便说一句,在Ocaml中,我通常将
fooop
(用一个有意义的名称替换
foo
,例如
findloop
scanloop
…)命名为内部尾部递归函数

当然,在Ocaml中,使用尾部递归内部函数比使用
while
构造更为惯用

另一种看待尾部递归调用的方法是,它们实际上是“带参数的GOTO”(通常作为机器跳转指令实现,并在机器寄存器中传递一些值)。

是用ML(或Ocaml)语言编写“循环”的正确方法(或Scheme,甚至是最常见的Lisp,但遗憾的是,其中没有迭代构造)

例如,以标准库的源代码为例(例如Ocaml)

尾部rec呼叫不会让你的同龄人感到困惑,他们对此很熟悉

顺便说一句,你也可以感觉到过程语言(如C、Java或C++)中的普通循环是严重隐藏的尾部递归调用,这是一个意见问题

顺便说一句,在Ocaml中,我通常将
fooop
(用一个有意义的名称替换
foo
,例如
findloop
scanloop
…)命名为内部尾部递归函数

当然,在Ocaml中,使用尾部递归内部函数比使用
while
构造更为惯用

另一种看待尾部递归调用的方法是,它们实际上是“带参数的GOTO”(通常作为机器跳转指令实现,并在机器寄存器中传递一些值)。

是用ML(或Ocaml)语言编写“循环”的正确方法(或Scheme,甚至是最常见的Lisp,但遗憾的是,其中没有迭代构造)

例如,以标准库的源代码为例(例如Ocaml)

尾部rec呼叫不会让你的同龄人感到困惑,他们对此很熟悉

顺便说一句,你也可以感觉到过程语言(如C、Java或C++)中的普通循环是严重隐藏的尾部递归调用,这是一个意见问题

顺便说一句,在Ocaml中,我通常将
fooop
(用一个有意义的名称替换
foo
,例如
findloop
scanloop
…)命名为内部尾部递归函数

当然,在Ocaml中,使用尾部递归内部函数比使用
while
构造更为惯用

另一种看待尾部递归调用的方法是,它们实际上是“带参数的GOTO”(通常作为机器跳转指令实现,并在机器寄存器中传递一些值)。

是用ML(或Ocaml)语言编写“循环”的正确方法(或Scheme,甚至是最常见的Lisp,但遗憾的是,其中没有迭代构造)

例如,以标准库的源代码为例(例如Ocaml)

尾部rec呼叫不会让你的同龄人感到困惑,他们对此很熟悉

顺便说一句,你也可以感觉到过程语言(如C、Java或C++)中的普通循环是严重隐藏的尾部递归调用,这是一个意见问题

顺便说一句,在Ocaml中,我通常将
fooop
(用一个有意义的名称替换
foo
,例如
findloop
scanloop
…)命名为内部尾部递归函数

当然,在Ocaml中,使用尾部递归内部函数比使用
while
构造更为惯用


看待尾部递归调用的另一种方式是,它们实际上是“带参数的GOTO”(通常作为机器跳转指令实现,并在机器寄存器中传递一些值).

我只希望我的代码尽可能干净优雅。在某些情况下,尾部递归不是在所有情况下,而是在某些情况下!!对我来说是有意义的,它会让你或其他程序员感到困惑吗?不,这是常见的做法。但是,包含尾部递归调用和非尾部调用的函数(即真正的)对同一函数的递归调用在实践中并不常见。@BasileStarynkevitch如果您在二叉树中搜索值,例如在Scheme中,您可以执行
(或(recur(car x))(recur(cdr x)))
在helper
recur
中。第一个递归调用会使堆栈增长,而第二个处于尾部位置,并且不会。我知道这一点,但我只是说这些在实践中并不常见。我只是希望我的代码尽可能干净优雅。在某些情况下,尾部递归不是在所有情况下,而是在某些情况下!!对我来说有意义这会使您或其他程序员感到困惑吗?不,这是常见的做法。但是,包含尾部递归调用和非尾部(即真正)递归调用的函数(对同一个函数)在实践中并不常见。@basilestrynkevitch如果您在二叉树中搜索值,例如,在Scheme中,您会
(或(recur(car x))(recur(cdr x))
在helper
recur
中。第一个递归调用会增加堆栈,而第二个递归调用处于尾部位置,并且不会。我知道这一点,但我只是说,这些在实践中并不常见。我只希望我的代码尽可能干净优雅。在某些情况下,尾部递归不会在