如果在ML中,递归数据类型的示例是:
datatype llist = Nil | Node of int * llist
Run Code Online (Sandbox Code Playgroud)
什么是相互递归的数据类型,在ML中是什么样的?
在我的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) 这是我一直在研究的第二个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)
我怎样才能解决这个问题?
单个递归函数可以应用尾递归优化,以防止堆栈溢出,但是相互递归函数呢?
这个答案显示了如何在F#中定义相互递归函数:
let rec F() =
G()
and G() =
F()
Run Code Online (Sandbox Code Playgroud)
是否以这种方式定义,以便生成的本机机器代码或字节码最终只包含一个函数,尾递归优化应用于F和G?这会阻止堆栈溢出吗?
对于相互递归函数,尾调用算法如何工作?
另一方面,Haskell不需要这样的语法.是因为Haskell的懒惰评估?或者@augustss建议,Haskell编译器是否也像上面那样做?
在为MIT/GNU Scheme (rel 9.2 ) 中的odd和even函数开发经典练习代码时,我遇到了一个问题,即我的代码不会因大整数值而终止。首先,我测试了以下代码,它处理正值和负值:
(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)