我不确定这是否是问这个问题的正确地方,但由于它涉及编程和代码,希望这是正确的地方。
我曾尝试在 Programmers and Computer Science SE 上发帖,但他们将我重定向到此站点。
问题是关于如何编写计算斐波那契数的寄存器机器代码/程序。代码的语法实际上非常简单。
(以下仅供参考,长帖见谅)
(更多解释见Richard Carl Jeffrey的Formal Logic: Its Scope And Limits一书)
根据维基百科,注册机是一种通用类的抽象机器,其使用方式类似于图灵机。(处理器)寄存器是作为 CPU 或其他数字处理器的一部分可用的少量存储。
我们可以通过将寄存器建模为空桶来简化问题,我们可以让弹珠或石头放入寄存器(“桶”)。规则是从桶中添加或删除弹珠以执行计算。
规则是:
1. 一台注册机使用有限数量的桶,以及无休止的弹珠供应。
2.每个桶都可以单独识别。弹珠不需要是可区分的。
3. 注册机程序是一组有限的指令:
- 将弹珠添加到桶中(然后继续执行下一条指令)。
- 或者从桶中取出一颗弹珠(如果可以的话,继续下一条指令,如果不能,则继续下一条指令)。
4. 程序可以写成流程图或指令列表。
下面是一个执行加法的寄存器机器程序的例子。
设 A、B、C 为桶。
1. (-B; 2,4) 表示从B桶中取出一颗弹子,如果可以则执行指令2,如果不能则
执行4 3
3. (+C; 1) 表示向 C 桶添加一颗弹子,然后执行指令 1
4. (-C; 5,-) 表示从 C 桶中取出一颗弹子,如果可以则执行指令 2,或退出如果不能
5. (+B; 4) 表示在桶 B 中添加一颗弹子,然后转到指令 4
很容易证明,假设我们在桶 A 中有 3 个弹珠,在桶 B 中有 2 个弹珠,在桶 C 中有 4 个弹珠。执行此算法后,将有 |A|+|B| = 3+2 = 桶 A 和 |B|+|C| 中有 5 个弹珠 = 2+4 = 桶 B 中有 6 个弹珠。
(我希望上面的例子足够清楚,便于说明)
(现在问题来了)
现在,我想编写一个寄存器机器代码,当在桶 A 中输入 n 时,返回(也在桶 A 中)第 n 个斐波那契数。斐波那契数是 0(第 0 个)、1(第 1 个)、1 = 0 + 1(第 2 个)等。我们可以使用任意数量的桶,目标是尽可能简单地编写代码(即最少的指令)。给定 F(0)=0 和 F(1)=1,斐波那契递归关系为 F(n)=F(n-1)+F(n-2)。
这是我的尝试和代码:
我的想法是使用存储桶 A 作为输入,最后作为输出 F(n)(因为问题需要存储桶 A 中的输出),存储桶 B 作为“计数器”,存储桶 C 作为 F (n-1) 和桶 D 作为 F(n-2)。
1. (+C; 2)
2. (-A; 3,4)
3. (+B; 2)
4. (-D; 5,7)
5. (+A; 4)
6. (-C; 5,7)
7. (-B; 6,-)
但遗憾的是,我的代码最多只能适用于 n=2,我正在努力使代码适用于任何 n>2。
我一直在考虑这个日日夜夜,如果有人能帮助我,我将不胜感激。如果有任何不清楚的地方,请随时要求我澄清。
非常感谢提前!