fabonacci数列

本节我们来用计算机来解决一个数学问题,虽然还无法像图灵那样完成那么伟大的成就,但确实可以把一些复杂的计算交给计算机来做,比如计算fabonacci数列。那么什么是fabonacci数列?我列出fabonacci数列前面几个数你一眼就能看明白了:1,1,2,3,5,8,13,21……。这个数列中每个数等于前面两个数相加,现在我想算出第100个数字是多少,该怎么办?我们可以把它交给计算机来做,然后我们只要在旁边喝一杯茶等待计算机的最终结果就好了。这里我使用前一章由我们设计的汇编语言编写了一个计算fabonacci数列的程序,其汇编代码如下所示。

  MOV [0], 0               //注释:把地址0的内存设置0
  MOV [1], 1               //注释:把地址1的内存设置1
  MOV [6], 1               //注释:把地址6的内存设置1
  MOV [7], 1               //注释:把地址7的内存设置1
  MOV [8], 0               //注释:把地址8的内存设置0
  MOV [11], 0              //注释:把地址11的内存设置0,用来计数
  MOV [12], 10             //注释:把地址12的内存设置10,用来控制循环次数
LOOP:
  ADD [8], [6], [7]        //注释:把内存地址6和7处的值相加,保存到地址8处
  ADD [6], [7], [0]        //注释:因为内存[0]值为0,相当把内存7复制到内存6
  ADD [7], [8], [0]        //注释:因为内存[0]值为0,相当把内存8复制到内存7
  ADD [11], [11], [1]      //注释:因为内存[1]值为1,所以循环计数加1
  JUMPIF EXIT, [11], [12]  //注释:判断是否满足条件跳出循环
  JUMP LOOP
EXIT:
  OUT [7]                  //注释:把计算结果显示到十六进制数码管

当我们把上述汇编代码转换成二进制指令后发现,它生成了几十条指令,而我们设计的计算机是4位的,它的ROM最多只能存放16条指令。所以,我把我们的计算机所有输入输出都改成了8位的,这里不过多解释它是如何改造的了,因为在Logisim软件里修改数据位的宽度比较简单,都是内置提供的功能。当改成8位后,其电路图基本上没有任何变化,只有“十六进制数码管”那里有些变化,因为一个数码管只能表示低4位数据,所以又增加了一个数码管表示高4位数据。使用新的8位计算机后,再来运行上述的汇编代码,它的演示动画如下图所示。

另外,我用python也实现了一模一样的功能,代码如下所示。如果你已经有编程基础,可以感受下两者之间的联系。

    var0 = 0
    var1 = 1
    var6 = 1
    var7 = 1
    var8 = 0
    var11 = 0
    var12 = 10
    while True:
        var8 = var6 + var7
        var6 = var7 + var0
        var7 = var8 + var0
        var11 = var11 + var1
        if var11 >= var12:
            break
    print(var7)

results matching ""

    No results matching ""