Assembly 无返回值、堆栈或数组的多个递归(仅全局变量)

Assembly 无返回值、堆栈或数组的多个递归(仅全局变量),assembly,recursion,jekyll,liquid,Assembly,Recursion,Jekyll,Liquid,这个问题是关于一种称为“Liquid”的高级模板语言。我为什么给它贴标签?因为我认为汇编程序员在手动处理多个递归方面有更多的经验 在liquid中,您可以通过包含具有特定参数的文件来创建“函数”: {% include file var1="a" var2="b" %} 到目前为止还不错——如果我们有办法返回,我们可以用它创建一个有效的多重递归循环 不幸的是,液体是我见过的最有缺陷的逻辑形式之一。它几乎没有图灵完成。没有返回值,没有作用域,数组只是可以拆分的字符串 使用我正在编写的多重递归函数

这个问题是关于一种称为“Liquid”的高级模板语言。我为什么给它贴标签?因为我认为汇编程序员在手动处理多个递归方面有更多的经验

在liquid中,您可以通过包含具有特定参数的文件来创建“函数”:

{% include file var1="a" var2="b" %}
到目前为止还不错——如果我们有办法返回,我们可以用它创建一个有效的多重递归循环

不幸的是,液体是我见过的最有缺陷的逻辑形式之一。它几乎没有图灵完成。没有返回值,没有作用域,数组只是可以拆分的字符串

使用我正在编写的多重递归函数,全局变量会被子类填充。我甚至连一堆东西都没有

如果我在树节点上设置布尔值true并递归到较低的节点中,如果任何较低的节点(或同一级别上的后续节点)设置它,它将删除较高节点的活动值

这在某种程度上限制了我的选择:

  • 将它们填充到全局变量中,并在调用子节点之前隐藏该变量
    • 哦,不!储藏室也会被砸烂的
  • 其他一些神秘的逻辑我一直在寻找,但找不到
我想要神秘的逻辑

利用active总是向上传播的事实,应该有一些操作顺序来正确地完成它,但我已经三天来一直在对此进行猛烈抨击,我无法正确地思考

尽管读这篇文章可能会让人更加困惑。

编译器(和asm程序员)通过在堆栈上按下状态、进行调用,然后从堆栈中弹出状态来实现多重递归。所以局部变量和参数在堆栈上

只要有足够的堆栈空间用于最大调用深度,这就可以递归地工作

我认为要使递归工作(当然不是尾部递归),您需要实现某种可以用作堆栈的数据结构,将状态推到堆栈上,然后将其弹出

完全通用的递归要求能够以任何深度保存和恢复状态

如果没有任何可变大小的存储,可以使用全局变量(如stack1、stack2、stack3等)实现一个固定大小的小堆栈,并使用一个计数器作为堆栈指针。您只需要尽可能多的变量作为递归的最大深度



不过,您可能可以使用一个实际上不是递归的函数来实现特定的算法。你说了些关于穿越一棵树的事?也许你可以看看有什么想法。其中一些涉及修改树。当然,如果您的树节点有父指针,那么遍历很容易,因为您可以在向下移动一侧后找到返回的路径。

在我的递归包含中,我这样做

{% assign n = include.n %}

{% if n == nil %}
  {% assign n = 0 %}
{% endif %}

++++ Do something on n
{% assign n = n  | plus: 1 %}

{% if n < something %}
  {% include self.html n=n %}
{% endif %}

++++ Reverse value of n to parent value
{% assign n = n  | minus: 1 %}
{%assign n=include.n%}
{%n==nil%}
{%n=0%}
{%endif%}
++++在n上做点什么
{%n=n |加:1%}
{%如果n

阅读更多关于、、和我提供的参考资料。也许液体是错误的工具。你考虑了吗?谢谢你回答这个问题!不幸的是,我不能让它迭代,因为我不知道用户输入的深度或宽度,我不能使用编号的全局变量,因为liquid没有任何“变量”(除非我想将其限制为最大深度),我应该能够将状态存储为字符串中的字符,并在每次迭代结束时将其弹出,但是液体会使它变得比需要的更硬,所以需要做很多工作:/@JV:是的,我的意思是将它限制在最大深度。在堆栈指针上使用一个大的丑陋的
开关
或其他东西,选择正确的全局变量。这就是我所说的“小的固定尺寸”。。。听起来液体对于这项工作来说是错误的工具,或者您应该选择一种更容易遍历的数据结构。我无法想象这会表现得很好。。。如果你能很好地将你的状态编码成固定大小的块,那么使用字符串作为堆栈听起来是合理的。我建议编写一个迭代算法,使用它自己的堆栈来跟踪它所需要的状态,而不是调用堆栈。整个要点是在jekyll中呈现一个菜单,而jekyll使用液体,所以这就是我要处理的全部。麻烦的状态是一个布尔值,所以我只想在字符串中添加一个
0
1
,然后将其从后面弹出。但是这不会传递状态,除非我使用深度作为2的幂来创建位掩码并将其传递到下一个级别,但是我认为这会非常复杂(并且只适用于ruby内置的体系结构的宽度)哦,根据你的例子,你也对jekyll做了一些棘手的事情-到目前为止,你觉得我的菜单怎么样?一个是通过url自动生成的,另一个是通过
\u data
生成的。一般来说,我认为数据驱动的菜单是多余的。你的自动菜单工作正常,但是页面顺序呢?我可以在那里的某个地方抛出一个排序参数,我肯定。这是id,有很多人希望自定义菜单(例如,能够重新排序)添加排序和反向排序-如果你能想到其他任何东西,就会提出一个问题:)