问题标签 [mutual-recursion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
538 浏览

recursion - 如何使用表示状态的函数在 F# 中获取工作状态机?

我正在尝试在 F# 中创建一个简单的状态机,但无法让两个具有循环依赖关系的状态正常工作。
我有这个州工厂:

我用它来创建两个相互递归的状态:

当调用pingState()并输入“go to pong”时,状态切换为 pong。但是当调用输入“go to ping”时,会抛出空引用异常。
无论如何,选择的方法是否存在这个问题,或者我应该以不同的方式对其进行建模?

0 投票
1 回答
1907 浏览

recursion - 球拍中的相互递归,使 cond 做两件事

我有两个定义,一个家谱和一个人。

我需要创建一个“相互递归”函数来计算树中后代的数量(包括人)。但是如果满足条件,我无法弄清楚如何让 cond 做不止一件事。

IE:

知道如何递归调用列表其他部分的函数并添加一个吗?

0 投票
2 回答
163 浏览

javascript - 如何在Javascript中制作相互递归的结构?

我想知道是否可以在 Javascript 中拥有相互递归的对象,如果可以,如何实现?

目标:

我想要三个对象:

  1. 一个表示Boolean具有两个值的类型,True并且False
  2. 代表类型True对象的一个Boolean
  3. 代表类型False对象的一个Boolean

诀窍是我想问True对象它的类型,我应该取回Boolean对象,我想问一个Boolean对象它的值,我应该取回 2 个对象:True对象和False对象。

但它应该完全是相互递归的,因为我得到了这样的东西(尽管它不一定必须完全像这样):

等等...

如果有帮助,它们应该满足以下属性:

并且这样做的能力应该是无限的

笔记

这些可以是函数而不是对象。呼叫不必完全像这样。

0 投票
2 回答
221 浏览

c++ - 避免循环依赖——需要相互包容

在我的 GUI 系统中,主要的构建块是Container类,可以绘制(= 是可绘制的)。然而,Container它本身是一种“表格”——它包含单元格。

Cell类用于布局。容器的单元格数由行数和列数定义。Cell对象不可见。

这就是问题所在。Cell无法绘制对象 - 它们包含Container对象,这些Cell对象在调用cell.draw().

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

Unique_ptr 错误

容器.hpp

细胞.hpp

有没有一种很好的方法来解决使用智能指针的情况(也许通过重新设计整个问题解决方案),或者我必须在这里使用原始指针?

0 投票
2 回答
862 浏览

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

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

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

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

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

另一方面,Haskell 不需要这样的语法。是因为 Haskell 的懒惰评估吗?或者正如@augustss 所建议的那样,Haskell 编译器是否也在做与上述相同的事情?

0 投票
2 回答
2875 浏览

haskell - OCaml 中的相互递归类型

在 Haskell 中,您可以执行以下操作:

你怎么能在 OCaml 中做同样的事情?我试过:

甚至可以在 OCaml 中定义相互递归的数据类型吗?如果不是那为什么?

将数据定义与 let 表达式进行比较:相互递归的数据类型对应于 using let rec(或者更适合type rec于需要更好的短语)。能够定义相互递归的数据类型有什么好处?我的 foobar 示例是微不足道的。您能想到相互递归数据类型的任何重要用途吗?

0 投票
1 回答
258 浏览

java - 将两个相互递归的方法转换为java中的单个递归方法?

我需要一个具有两个相互递归方法的程序并修改该程序,使其包含一个递归方法。据我了解,我需要通过将递归调用按调用顺序放在一个方法中来组合这两种递归方法。问题是通过方法传递了 4 个整数,第一个方法调用第二个方法两次,第二个方法调用第一个方法两次。

这是原始代码:

下面是我最近修改的代码。我知道它很难看,但我只是不知道如何相互独立地调整 x 和 y 坐标。我试图通过创建更多变量来解决这个问题,但我不禁觉得我只是在做更多的工作。我能找到的最接近的堆栈问题是this。我从 11 点就开始了,现在是 4:15。非常感谢您朝正确的方向轻推,感谢您抽出宝贵的时间。

编辑 * 感谢您的快速回复,我很感激。我知道以这种方式分解相互递归方法似乎违反直觉,但我是编程和 java 的新手,所以我正在探索分解问题的不同方法。这就是我最终将其分解为并且运行良好的原因。感谢您的时间。

修改后的代码:

0 投票
3 回答
2882 浏览

python - python如何实现相互递归?

转向具有 C/Java 背景的 python,我最近不得不实现一个相互递归,但是 python 中的一些东西困扰着我:

由于一个python程序是逐行解释的,如果我在同一个python文件中一个接一个地有两个函数:

当解释器正在阅读A时,B尚未定义,但是这段代码不会给我一个错误

我的理解是,当被解释时,python 会在一些本地名称空间中def添加一个条目,但对于函数体,它只进行语法检查:locals(){"function name": function address}

0 投票
0 回答
114 浏览

f# - 相互递归提取和求和元组的元素

我构造了一个相互递归的类型,由更多的原始类型组成,也定义如下:

subcol 可能是也可能不是空列表,但如果不是,我想将给定集合的值以及对 Subcol 的递归调用和它可能包含的 Value defs 相加。为此,我构建了以下函数:

我希望函数调用 colList s

从 Subcol 类型生成 int ,但是我收到以下错误:

错误 FS0001:类型不匹配。需要一个值列表但给定一个子列类型“值”与类型“集合”不匹配

我希望 colList 接受 Subcols,而不是 Value 列表。

任何帮助表示赞赏,谢谢。

0 投票
2 回答
338 浏览

c - Compiling Tail-Call Optimization In Mutual Recursion Across C and Haskell

I'm experimenting with the foreign-function interface in Haskell. I wanted to implement a simple test to see if I could do mutual recursion. So, I created the following Haskell code:

Note that the recursive case is a call to countdownC, so this should be tail-recursive.

In my C code, I have

Which is likewise tail recursive. So then I make a

and compile with make MutualRecursion.

And... upon running, it segfaults after printing 8991. Just as a test to make sure gcc itself can handle tco in mutual recursion, I did

and that worked quite fine. It also works in the single-recursion case of just in C and just in Haskell.

So my question is, is there a way to indicate to GHC that the call to the external C function is tail recursive? I'm assuming that the stack frame does come from the call from Haskell to C and not the other way around, since the C code is very clearly a return of a function call.