我的任务是编写以下公式的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代码。
答案 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的列表(因为单个项目是按顺序排序的)。
所以(假设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 = 5
,3 + 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个全局变量n1
和n2
,以便...
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),我们需要知道f(3)和f(2)是什么。这些都不是基本情况,所以我们必须进行一些递归计算。好的......f(4) = 3 f(4-1)+ 2 f(4-2)= 3 f(3) + 2 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