Recursion 您遇到的最好的递归代码是什么?

Recursion 您遇到的最好的递归代码是什么?,recursion,functional-programming,Recursion,Functional Programming,因为递归而简化了非常复杂的逻辑的情况,在日常编程中使用递归的情况我最喜欢使用递归的是蹦床。这是一种构建可组合代码的简便方法,在没有尾部调用消除的情况下,不会使语言中的调用堆栈溢出 下面是一个很好的例子: 我还强烈推荐鲁纳里的。我最喜欢的递归用法是蹦床。这是一种构建可组合代码的简便方法,在没有尾部调用消除的情况下,不会使语言中的调用堆栈溢出 下面是一个很好的例子: 我还强烈推荐鲁纳里的。我最喜欢的递归用法是蹦床。这是一种构建可组合代码的简便方法,在没有尾部调用消除的情况下,不会使语言中的调用堆栈溢

因为递归而简化了非常复杂的逻辑的情况,在日常编程中使用递归的情况

我最喜欢使用递归的是蹦床。这是一种构建可组合代码的简便方法,在没有尾部调用消除的情况下,不会使语言中的调用堆栈溢出

下面是一个很好的例子:


我还强烈推荐鲁纳里的。

我最喜欢的递归用法是蹦床。这是一种构建可组合代码的简便方法,在没有尾部调用消除的情况下,不会使语言中的调用堆栈溢出

下面是一个很好的例子:


我还强烈推荐鲁纳里的。

我最喜欢的递归用法是蹦床。这是一种构建可组合代码的简便方法,在没有尾部调用消除的情况下,不会使语言中的调用堆栈溢出

下面是一个很好的例子:


我还强烈推荐鲁纳里的。

我最喜欢的递归用法是蹦床。这是一种构建可组合代码的简便方法,在没有尾部调用消除的情况下,不会使语言中的调用堆栈溢出

下面是一个很好的例子:


我还强烈推荐RúnarÓli的。

递归的一个惊人例子是Haskell和相关语言中的不动点组合器:

fix f = f (fix f)
它允许我们编写递归函数,而无需显式递归:

fac = go (fix go) where
    go g 0 = 1
    go g n = n * g (n-1)
虽然它并不是很有用,因为Haskell当然有递归

更重要的是,同样的技巧也适用于类型级别。以下是一种为类似于目录结构的文件系统建模的类型:

data DirEntry a = Dir [(String, a)] | File String
data Fix t = Y (t (Fix t))
type Directory = Fix DirEntry
这样,我们实际上可以处理类型为的值

DirEntry (DirEntry (DirEntry (DirEntry ...)))  -- nested arbitrarily deep

没有
目录
目录
本身是递归的。

递归的一个惊人例子是Haskell和相关语言中的不动点组合符:

fix f = f (fix f)
它允许我们编写递归函数,而无需显式递归:

fac = go (fix go) where
    go g 0 = 1
    go g n = n * g (n-1)
虽然它并不是很有用,因为Haskell当然有递归

更重要的是,同样的技巧也适用于类型级别。以下是一种为类似于目录结构的文件系统建模的类型:

data DirEntry a = Dir [(String, a)] | File String
data Fix t = Y (t (Fix t))
type Directory = Fix DirEntry
这样,我们实际上可以处理类型为的值

DirEntry (DirEntry (DirEntry (DirEntry ...)))  -- nested arbitrarily deep

没有
目录
目录
本身是递归的。

递归的一个惊人例子是Haskell和相关语言中的不动点组合符:

fix f = f (fix f)
它允许我们编写递归函数,而无需显式递归:

fac = go (fix go) where
    go g 0 = 1
    go g n = n * g (n-1)
虽然它并不是很有用,因为Haskell当然有递归

更重要的是,同样的技巧也适用于类型级别。以下是一种为类似于目录结构的文件系统建模的类型:

data DirEntry a = Dir [(String, a)] | File String
data Fix t = Y (t (Fix t))
type Directory = Fix DirEntry
这样,我们实际上可以处理类型为的值

DirEntry (DirEntry (DirEntry (DirEntry ...)))  -- nested arbitrarily deep

没有
目录
目录
本身是递归的。

递归的一个惊人例子是Haskell和相关语言中的不动点组合符:

fix f = f (fix f)
它允许我们编写递归函数,而无需显式递归:

fac = go (fix go) where
    go g 0 = 1
    go g n = n * g (n-1)
虽然它并不是很有用,因为Haskell当然有递归

更重要的是,同样的技巧也适用于类型级别。以下是一种为类似于目录结构的文件系统建模的类型:

data DirEntry a = Dir [(String, a)] | File String
data Fix t = Y (t (Fix t))
type Directory = Fix DirEntry
这样,我们实际上可以处理类型为的值

DirEntry (DirEntry (DirEntry (DirEntry ...)))  -- nested arbitrarily deep

没有
Directory
DirEntry
本身是递归的。

当然,在没有TCE的语言中,你会反复写
trampoline
当然,在没有TCE的语言中,你会反复写
trampoline
当然,在一种没有TCE的语言中,你会反复写
trampoline
当然,在一种没有TCE的语言中,你会反复写
trampoline
。。。