标签: mutual-recursion

什么是相互递归的类型?

如果在ML中,递归数据类型的示例是:

datatype llist = Nil | Node of int * llist
Run Code Online (Sandbox Code Playgroud)

什么是相互递归的数据类型,在ML中是什么样的?

types ml sml recursive-datastructures mutual-recursion

1
推荐指数
1
解决办法
1798
查看次数

避免循环依赖 - 需要相互遏制

在我的GUI系统中,主要构建块是Container类,可以绘制(=可绘制).然而,Container它本身就是一种" 一种表 " - 它包含细胞.

Cellclass用于布局.容器具有的单元格数由行数和列数定义.Cell对象不可见.

这就是问题所在.Cell无法绘制Container对象- 它们包含对象,这些Cell对象在调用时由对象中定义的规则(对齐,填充等)绘制cell.draw().

我知道这可以通过使用原始指针来避免在这里创建的循环依赖关系轻松解决,但我想使用智能指针,如果可能的话.但是,根据我得到的错误,显然智能指针必须知道对象的大小,不像原始指针.

Unique_ptr错误

/usr/include/c++/4.8/bits/unique_ptr.h:65:22: error: invalid application of ‘sizeof’ to incomplete type ‘Container’
  static_assert(sizeof(_Tp)>0,
Run Code Online (Sandbox Code Playgroud)

Container.hpp

#include <Cell.hpp> // Causes circular dependency
class Cell; // Causes error: invalid application of ‘sizeof’

class Container
{
// ...
private:
    std::vector<std::unique_ptr<Cell>> cells;
// ...
}
Run Code Online (Sandbox Code Playgroud)

Cell.hpp

#include <Container.hpp> //Causes circular dependency
class Container; // Causes error: …
Run Code Online (Sandbox Code Playgroud)

c++ mutual-recursion containment

1
推荐指数
1
解决办法
193
查看次数

使用SML判断数字是奇数还是偶数

这是我一直在研究的第二个SML程序.这些函数是相互递归的.如果我称奇数(1)我应该变为真,甚至(1)我应该变得虚假.这些函数应适用于所有正整数.但是,当我运行这个程序时:

fun
    odd (n) = if n=0 then false else even (n-1);
and
    even (n) = if n=0 then true else odd (n-1);
Run Code Online (Sandbox Code Playgroud)

我明白了:

[opening test.sml]
test.sml:2.35-2.39 Error: unbound variable or constructor: even
val it = () : unit
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

recursion ml sml smlnj mutual-recursion

1
推荐指数
1
解决办法
988
查看次数

函数式编程语言中的相互递归函数

单个递归函数可以应用尾递归优化,以防止堆栈溢出,但是相互递归函数呢?

这个答案显示了如何在F#中定义相互递归函数:

let rec F() = 
    G()
and G() =
    F()
Run Code Online (Sandbox Code Playgroud)

是否以这种方式定义,以便生成的本机机器代码或字节码最终只包含一个函数,尾递归优化应用于F和G?这会阻止堆栈溢出吗?

对于相互递归函数,尾调用算法如何工作?

另一方面,Haskell不需要这样的语法.是因为Haskell的懒惰评估?或者@augustss建议,Haskell编译器是否也像上面那样做?

f# haskell functional-programming ml mutual-recursion

0
推荐指数
1
解决办法
599
查看次数

在Scheme中的相互递归中获得尾调用优化

在为MIT/GNU Scheme (rel 9.2 ) 中的oddeven函数开发经典练习代码时,我遇到了一个问题,即我的代码不会因大整数值而终止。首先,我测试了以下代码,它处理正值和负值:

(define error-message-number "Error. x must be a number")

(define odd?
  (lambda (x)
    (cond 
      ((not (integer? x)) error-message-number)
      ((= x 0) #f)
      ((< x 0) (even? (+ x 1))) ;for negatives
      (else (even? (- x 1)))))) ;if number n is odd then n - 1 is even 

(define even?
  (lambda (x)
    (cond 
      ((not (integer? x)) error-message-number)
      ((= x 0) #t)
      ((< x 0) (odd? (+ x 1))) ;for negatives
      (else …
Run Code Online (Sandbox Code Playgroud)

recursion scheme tail-recursion mutual-recursion mit-scheme

0
推荐指数
1
解决办法
141
查看次数