algorithm - 如何为 Fibonacci 编写寄存器机器代码

标签 algorithm

我不确定在这里问这个问题是否合适,但由于它涉及编程和代码,希望这是正确的地方。

我曾尝试在 Programmers 和 Computer Science SE 上发帖,但他们将我重定向到此站点。

问题是关于如何编写计算斐波那契数的寄存器机器代码/程序。代码的语法实际上非常简单。

(以下内容仅供引用,文章过长请见谅)
(有关更多解释,请参阅 Richard Carl Jeffrey 的《形式逻辑:它的范围和限制》一书)

根据维基百科,寄存器机是抽象机的通用类,其使用方式类似于图灵机。 (处理器)寄存器是作为 CPU 或其他数字处理器的一部分可用的少量存储空间。

我们可以通过将寄存器建模为空桶来简化问题,我们可以将弹珠或石头放入寄存器(“桶”)中。规则是从桶中添加或移除弹珠以执行计算。

规则是:
1. 注册机使用有限数量的桶和源源不断的弹珠。
2.每个桶都可以单独标识。弹珠不需要区分。
3. 寄存器机程序是一组有限的指令:
- 将大理石添加到桶中(然后继续执行下一条指令)。
- 或者从桶中取出一颗弹子(然后继续下一个 如果可以,请提供指导;如果不能,请提供其他指导)。
4. 程序可以写成流程图或指令列表。

下面是一个执行加法的寄存器机程序的例子。
设 A、B、C 为桶。
1. (-B; 2,4) 表示从桶B中拿走一颗弹子,如果可以则转到指令2,如果不能则转到指令4
2. (+A; 3) 表示向桶A中添加一颗弹子,然后转到指令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(n)=F(n-1)+F(n-2),给定 F(0)=0 和 F(1)=1。

这是我的尝试和代码:
我的想法是使用桶 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。

这几天几夜我都在想,如果有人能帮我解决这个问题,我将不胜感激。如果有任何不清楚的地方,请随时向我询问。

非常非常感谢!

最佳答案

下面是一些示例 Python 代码,用于模拟在 11 条指令中完成任务的寄存器机:

# Store loop counter in 4
# Store F(n) in 1
# Store F(n+1) in 2
# Redistribute 2 to 1 and 3 to get F(n+1)+F(n),0,F(n+1)
# then move back to the order F(n+1),F(n+1)+F(n),0
code={1:(-1,2,3),   # Move n to 
      2:(+4,1),     #    bin 4 to act as loop counter
      3:(+2,4),     # Initialise bin 2 with F(1)=1
      4:(-4,5,0),   # Check for completion
      5:(-2,6,8),   # redistribute F(n+1)
      6:(+1,7),     #    to bin 1
      7:(+3,5),     #    and bin 3
      8:(-1,9,10),  # Move bin 1 to
      9:(+2,8),     #    bin 2
      10:(-3,11,4), # and bin 3
      11:(+1,10)}   #    to bin 1

def fib(n):
    buckets=[0,n,0,0,0]
    instruction_pointer = 1
    while instruction_pointer:
        ins = code[instruction_pointer]
        x = ins[0]
        if x>0:
            buckets[x]+=1
            instruction_pointer = ins[1]
        else:
            x=-x
            if buckets[x]>0:
                buckets[x]-=1
                instruction_pointer = ins[1]
            else:
                instruction_pointer = ins[2]
    return buckets[1]

for n in xrange(10):
    print n,fib(n)

关于algorithm - 如何为 Fibonacci 编写寄存器机器代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16798886/

相关文章:

python - 检测图中的高振幅

python - 选择具有共享元素的集合的算法

algorithm - 在一组 100 万个数字中找到一个唯一数字的有效算法是什么?

javascript - 如何限制圆圈在一个范围内的移动?

algorithm - 通过包装器优化斐波那契数列递归函数

c++ - 贪婪与动态规划

java - 重新排列单词以在一行中容纳最大单词数并使用 Java 创建更少的行数

algorithm - 矩阵中最短距离中的最大值

algorithm - 关于堆排序算法的问题

卡片拼图的算法解法