如题
éæ¨å®ä¹
éæ¨ç®æ³æ¯ä¸ç§ç®åçç®æ³ï¼å³éè¿å·²ç¥æ¡ä»¶ï¼å©ç¨ç¹å®å ³ç³»å¾åºä¸é´æ¨è®ºï¼ç´è³å¾å°ç»æçç®æ³ã
éæ¨ç®æ³å为顺æ¨åéæ¨ä¸¤ç§ã
顺æ¨æ³
æè°é¡ºæ¨æ³æ¯ä»å·²ç¥æ¡ä»¶åºåï¼éæ¥æ¨ç®åºè¦è§£å³çé®é¢çæ¹æ³å«é¡ºæ¨ã
å¦ææ³¢æå¥æ°åï¼è®¾å®çå½æ°ä¸º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)
ç±æ¤å¯è§,éæ¨çæçè¦é«ä¸äº,å¨å¯è½çæ åµä¸åºå°½é使ç¨éæ¨.ä½æ¯éå½ä½ä¸ºæ¯è¾åºç¡çç®æ³,å®çä½ç¨ä¸è½å¿½è§.æ以,å¨ææ¡è¿ä¸¤ç§ç®æ³çæ¶ååºè¯¥ç¹å«æ³¨æ.
éæ¨ç®æ³æ¯ä¸ç§ç®åçç®æ³ï¼å³éè¿å·²ç¥æ¡ä»¶ï¼å©ç¨ç¹å®å ³ç³»å¾åºä¸é´æ¨è®ºï¼ç´è³å¾å°ç»æçç®æ³ã
éæ¨ç®æ³å为顺æ¨åéæ¨ä¸¤ç§ã
顺æ¨æ³
æè°é¡ºæ¨æ³æ¯ä»å·²ç¥æ¡ä»¶åºåï¼éæ¥æ¨ç®åºè¦è§£å³çé®é¢çæ¹æ³å«é¡ºæ¨ã
å¦ææ³¢æå¥æ°åï¼è®¾å®çå½æ°ä¸º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.
如递归中的例 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
根据古人做成的啊!