在brainfuck中的递归函数的示例

时间:2012-12-07 10:52:29

标签: recursion fibonacci brainfuck

直截了当 - 我一直在学习脑力,但我无法绕过它的递归理念。我已经搜索了这个并搜索了论坛 - 如果需要,请提前道歉 - 并且什么也没做。

首先,它确实可能吗?

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

我特意尝试使用递归来计算Fibonacci数,所以如果我们可以根据它进行计算,它会有很大的帮助。

3 个答案:

答案 0 :(得分:4)

由于BF除了磁带和指针之外没有真正提供任何东西以及非常基本的循环功能(通常你需要确保指针最终在它开始的同一个地方,所谓的平衡循环。在没有它们平衡的情况下你可以做循环的情况,例如数组),在它中实现递归算法是相当困难的。您可以尝试在bf中模拟“普通”计算机(这一切都取决于您如何处理磁带)。我相信C2BF项目以这种方式工作(它将C编译成脑力)。如果我没有弄错的话,他们会在交替的堆栈/堆中处理单元组(使得某些指针操作有点不同,因为所有内容都必须乘以2)

所以,毕竟这篇文章是我的结论:尽管真的很难,但可以在brainfuck中实现递归算法。我要求你记住的是,每个递归算法都可以迭代完成。你只需要维护自己的堆栈。这实际上是你想要以递归方式实现它的最终结果。但是如果你认为它是迭代的并且维护你自己的堆栈而不是递归,它将帮助你理解你实际在做什么,并最终产生更好的设计算法。

答案 1 :(得分:0)

标准Brainfuck既没有调用也没有调用堆栈,所以你必须实现自己的堆栈才能进行递归编程。

二维语言SNUSP与Brainfuck具有相同的运算符和内存模型,但添加了一个调用堆栈和ENTER(“@”)和LEAVE(“#”)指令,允许递归编程。用于循环的Brainfuck括号用反射器(“\”,“/”),skip(“!”)和skip-if-zero(“?”)替换。例如,这是Fibonacci函数的递归实现:

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

答案 2 :(得分:0)

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

正如我说过的,我计划进行这种实现,因此一旦有了可用的原型,我将进行更新。希望我的回答就足够了。