Recursion brainfuck中的递归函数示例

Recursion brainfuck中的递归函数示例,recursion,fibonacci,brainfuck,Recursion,Fibonacci,Brainfuck,直截了当地说——我一直在学习brainfuck,但我很难在其中绕开递归的概念。我已经在谷歌上搜索过了,搜索过论坛,所以如果需要的话,我会提前道歉,但什么也没找到 首先,这真的可能吗 如果有,有什么例子吗?我会加上任何有用的东西 我特别尝试使用递归计算斐波那契数,因此如果我们能以此为基础,这将非常有帮助。因为BF除了磁带、指针和非常基本的循环功能之外,没有其他功能(通常,您需要确保指针结束于它开始时的同一位置,即所谓的平衡循环。在极少数情况下,您可以在不平衡它们(如数组)的情况下执行循环),在其中

直截了当地说——我一直在学习brainfuck,但我很难在其中绕开递归的概念。我已经在谷歌上搜索过了,搜索过论坛,所以如果需要的话,我会提前道歉,但什么也没找到

首先,这真的可能吗

如果有,有什么例子吗?我会加上任何有用的东西


我特别尝试使用递归计算斐波那契数,因此如果我们能以此为基础,这将非常有帮助。

因为BF除了磁带、指针和非常基本的循环功能之外,没有其他功能(通常,您需要确保指针结束于它开始时的同一位置,即所谓的平衡循环。在极少数情况下,您可以在不平衡它们(如数组)的情况下执行循环),在其中实现递归算法非常困难。您可以尝试在bf中模拟“正常”计算机(这完全取决于你如何处理磁带)。我相信C2BF项目是这样工作的(它将C编译成brainfuck)。如果我没有弄错的话,它们以交替的堆栈/堆对处理单元组(使某些指针操作有点不同,因为所有操作都必须乘以2)


所以,在所有这些文本之后,我的结论是:在brainfuck中实现递归算法是可能的,尽管这确实很难。我敦促你们记住的是,每个递归算法都可以迭代完成。你们只需要维护自己的堆栈。如果你们想实现,这实际上就是你们最终要做的事情它是递归的。但是如果你认为它是迭代的,并且维护你自己的堆栈,而不是递归的,那么它将帮助你理解你实际上在做什么,并最终产生一个更好的算法。

因为BF除了磁带、指针和非常基本的循环功能之外,没有其他功能(通常,您需要确保指针结束于它开始时的同一位置,即所谓的平衡循环。在极少数情况下,您可以在不平衡它们(如数组)的情况下执行循环),在其中实现递归算法非常困难。您可以尝试在bf中模拟“正常”计算机(这完全取决于你如何处理磁带)。我相信C2BF项目是这样工作的(它将C编译成brainfuck)。如果我没有弄错的话,它们以交替的堆栈/堆对处理单元组(使某些指针操作有点不同,因为所有操作都必须乘以2)


所以,在所有这些文本之后,我的结论是:在brainfuck中实现递归算法是可能的,尽管这确实很难。我敦促你们记住的是,每个递归算法都可以迭代完成。你们只需要维护自己的堆栈。如果你们想实现,这实际上就是你们最终要做的事情它是递归的。但是如果你认为它是迭代的,并且维护你自己的堆栈,而不是递归的,那么它将帮助你理解你实际上在做什么,并最终产生一个更好的算法。

标准Brainfuck既没有调用,也没有调用堆栈,所以你必须实现你自己的堆栈才能执行递归的p程序设计

二维语言SNUSP与Brainfuck具有相同的运算符和内存模型,但添加了一个调用堆栈和回车(“@”)和回车(“#”)指令,允许递归编程。Brainfuck的循环括号被反射器(“\”、“/”、跳过(!”)和零时跳过(“?”)取代。例如,下面是斐波那契函数的递归实现:

             /========\    />>+<<-\  />+<-\
fib==!/?!\-?!\->+>+<<?/>>-@\=====?/<@\===?/<#
      |  #+==/     fib(n-2)|+fib(n-1)|
      \=====recursion======/!========/

标准Brainfuck既没有调用也没有调用堆栈,因此您必须实现自己的堆栈才能进行递归编程

二维语言SNUSP与Brainfuck具有相同的运算符和内存模型,但添加了一个调用堆栈和回车(“@”)和回车(“#”)指令,允许递归编程。Brainfuck的循环括号被反射器(“\”、“/”、跳过(!”)和零时跳过(“?”)取代。例如,下面是斐波那契函数的递归实现:

             /========\    />>+<<-\  />+<-\
fib==!/?!\-?!\->+>+<<?/>>-@\=====?/<@\===?/<#
      |  #+==/     fib(n-2)|+fib(n-1)|
      \=====recursion======/!========/
/=======\/>++更新:
我已经实施了这样的事情

原始信息:

我还没有实现这样一个东西,但我会更新后,我会。 然而,我想到了一个真正递归函数的实现。 首先请注意,brainfuck只在一个方向上运行代码,因此我们不能实际使用代码存储进行递归。我们唯一的其他存储方式是代码正在更改的存储。 因此,实际上,我们必须编写代码将函数保存在存储器上,然后在不更改存储器的情况下读取该存储器并相应地执行它。这反过来需要一个堆栈和一些更复杂的东西

正如我所说,我计划进行这样的实现,所以一旦我有了一个工作原型,我将进行更新。希望我的答案足够了。

更新: 我已经实施了这样的事情

原始信息:

我还没有实现这样一个东西,但我会更新后,我会。 然而,我想到了一个真正递归函数的实现。 首先请注意,brainfuck只在一个方向上运行代码,因此我们不能实际使用代码存储进行递归。我们唯一的其他存储方式是代码正在更改的存储。 因此,实际上,我们必须编写代码将函数保存在存储器上,然后在不更改存储器的情况下读取该存储器并相应地执行它。这反过来需要一个堆栈和一些更复杂的东西


正如我所说,我计划进行这样的实现,所以一旦我有了一个工作原型,我将进行更新。希望我的答案足够了。

此外,如果您想要实现的是斐波那契,您甚至不需要维护堆栈,因为您只需要最后两个值。(从技术角度来说,它可以进行尾部调用优化)。“我敦促的是