递推算法是怎么回事?

如题

递推定义
递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。

递推算法分为顺推和逆推两种。

顺推法
所谓顺推法是从已知条件出发,逐步推算出要解决的问题的方法叫顺推。

如斐波拉契数列,设它的函数为f(n),已知f(1)=1,f(2)=1;f(n)=f(n-2)+f(n-1)(n>=3,n∈N)。则我们通过顺推可以知道,f(3)=f(1)+f(2)=2,f(4)=f(2)+f(3)=3……直至我们要求的解。

逆推法
所谓逆推法从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为逆推。

递推与递归的比较
相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值.

比如阶乘函数:f(n)=n*f(n-1)

在f(3)的运算过程中,递归的数据流动过程如下:

f(3){f(i)=f(i-1)*i}-->f(2)-->f(1)-->f(0){f(0)=1}-->f(1)-->f(2)--f(3){f(3)=6}

而递推如下:

f(0)-->f(1)-->f(2)-->f(3)

由此可见,递推的效率要高一些,在可能的情况下应尽量使用递推.但是递归作为比较基础的算法,它的作用不能忽视.所以,在把握这两种算法的时候应该特别注意.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-08
递归的很多问题可以转为递推(来处理,通常递推处理的效率比递归高得多。比如象阶乘、 Fibonacci数列等。它们的相邻数之间有着明显的规律性的变化,通常可以将递归结束的条件作为递推的初始条件,并利用这种规律性一步一步递推到结果。这种递推通常采用循环迭代的方法,如循环累乘、循环累加等。

如递归中的例 1转为递推算法时用循环累加来实现。

var f0,f1,f2:real;
i,n:byte;
begin
readln(n);
f0:=1;f1:=2;
for i:=2 to n do
begin
f2:=f0+f1;
f0:=f1;
f1:=f2
end;
writeln(f2:1:0)
end.

在用递归算法时,只要输入的 n值稍大,程序求解就很困难,而递推则效率高很多。

在计算递归算法中的例 3时,如果将自然数 n的范围扩大到 1500以内,则用递归算法递归调用的次数过多,在求 800以上的数的时候就会出现困难,但用递推却可以大大缩小问题的规模。

递归算法中例 3的递推程序:

var s:array[1..1500] of real;
i,j,n:integer;
begin
readln(n);
for i:=1 to n do s[i]:=1;
for i:=2 to n do
if odd(i) then s[i]:=s[i-1]
else
for j:=1 to i div 2 do
s[i]:=s[i]+s[j];
writeln(s[n]:2:0)
end.
第2个回答  2013-06-08
根据古人做成的啊!

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网