f(n),理解方程式

时间:2012-06-05 01:14:32

标签: mips equations equation-solving

我的任务是编写以下公式的MIPS指令代码:

f(n) = 3 f(n-1) + 2 f(n-2)  
f(0) = 1
f(1) = 1

我在理解公式的实际含义时遇到了问题。

据我所知,我们正在将一个int n传递给双重递归程序。

因此对于f(0),等式为:

f(n)=3*1(n-1) + 2*(n-2)

如果n = 10,则等式为:

f(10)=3*1(10-1) + 2*(10-2)

我知道我根本没有做到这一点,因为它不会递归。任何关于等式实际意味着什么的光都会很棒。一旦我理解了等式,我应该能够编写MIPS代码。

3 个答案:

答案 0 :(得分:3)

我认为这是一个差异方程式。

您有两个起始值:

f(0) = 1
f(1) = 1
f(n) = 3*f(n-1) + 2*f(n-2)

所以现在你可以继续这样:

f(2) = 3*f(1) + 2*f(0) = 3 + 2 = 5
f(3) = 3*f(2) + 2*f(1) = 15 + 2 = 17

所以你的递归方法看起来像这样(我会写类似Java的表示法):

public int f(n) {
    if (n == 0) {
        return 1;
    } else if (n == 1) {
        return 1; 
    } else { 
        return 3*f(n-1) + 2*f(n-2); // see? the recursion happens here.
    }
}

答案 1 :(得分:0)

不,我认为你是对的,它是递归的。它似乎是Fibonacci Sequence的变体,这是一个典型的递归问题

请记住,递归算法有两部分:

  1. 基本情况
  2. 递归电话
  3. 基本案例指定您不能再递归的点。例如,如果要递归排序,则基本情况是长度为1的列表(因为单个项目是按顺序排序的)。

    所以(假设n不是负数),你有2个基本情况:n = 0和n = 1.如果你的函数收到的n值等于0或1,那么再递归是没有意义的< / p>

    考虑到这一点,您的代码应该如下所示:

    function f(int n):
        #check for base case
    
        #if not the base case, perform recursion
    

    所以让我们以Fibonacci为例。

    在Fibonacci序列中,每个数字是它之前的2个数字的总和。因此,给定序列1, 2,下一个数字显然是1 + 2 = 3,之后的数字是2 + 3 = 53 + 5 = 8,依此类推。一般来说,第n个Fibonacci数是第(n-1)个Fibonacci数加上第(n-2)个Fibonacci数,或f(n) = f(n - 1) + f(n - 2)

    但序列从哪里开始?这是基本情况。斐波纳契将他的序列定义为从1, 1开始。这意味着,对于我们的目的,f(0) = f(1) = 1。所以......

    function fibonacci(int n):
        if n == 0 or n == 1:
            #for any n less than 2
            return 1
    
        elif n >= 2:
            #for any n 2 or greater
            return fibonacci(n-1) + fibonacci(n-2)
    
        else:
            #this must n < 0
            #throw some error
    

    请注意,Fibonacci与递归一起教的原因之一是因为它表明有时递归是一个坏主意。我不会在这里讨论它,但对于大n这种递归方法非常效率低下。另一种方法是拥有2个全局变量n1n2,以便...

    n1 = 1
    n2 = 1
    
    print n1
    print n2
    
    loop:
        n = n1 + n2
        n2 = n1
        n1 = n
    
        print n
    

    将打印序列。

答案 2 :(得分:0)

您有两种基本情况:

  

f(0) = 1
   f(1) = 1

其他任何东西都使用递归公式。例如,让我们计算f(4)。这不是基本案例之一,因此我们必须使用完整的等式。插入n = 4我们得到:

  

f(4) = 3 f(4-1)+ 2 f(4-2)= 3 f(3) + 2 f( 2)

嗯,还没有完成。要计算f(4),我们需要知道f(3)和f(2)是什么。这些都不是基本情况,所以我们必须进行一些递归计算。好的......

  

f(3) = 3 f(3-1)+ 2 f(3-2)= 3 f(2) + 2 f( 1)
   f(2) = 3 f(2-1)+ 2 f(2-2)= 3 f(1) + 2 f(0)< /强>

我们去!我们已经触底。 f(2)是根据f(1)和f(0)定义的,我们知道这两个值是什么。我们得到了这些,所以我们不需要再做任何递归计算。

  

f(2) = 3 f(1) + 2 f(0) = 3×1 + 2×1 = 5

现在我们知道f(2)是什么,我们可以解开递归链并解决f(3)。

  

f(3) = 3 f(2) + 2 f(1) = 3×5 + 2×1 = 17

最后,我们再次解开并解决f(4)。

  

f(4) = 3 f(3) + 2 f(2) = 3×17 + 2×5 = 61