急求 一道C语言题目的基本准确答案

我们布置的一道C语言的题目会关系到重要成绩能帮忙的请尽力谢谢!!!!题目如下:已知斐波那契数列第n项的计算公式如下。在计算时有2种方法:递归和非递归。通过输出数列前40项... 我们布置的一道C语言的题目 会关系到重要成绩 能帮忙的请尽力 谢谢!!!!

题目如下:

已知 斐波那契数列第n项的计算公式如下。在计算时有2种方法:递归和非递归。通过输出数列前40项,体会两种方法的差异。
0 n=o
fib(n){ 1 n=1
fib(n-1)+fib(n-2) n>1
展开
 我来答
允伶俐U7
2009-04-16 · TA获得超过1.4万个赞
知道小有建树答主
回答量:222
采纳率:100%
帮助的人:0
展开全部
C语言程序

main()
{
long fib[40] = {0,1};
int i;
for(i=2;i<40;i++)
{
fib[i ] = fib[i-1]+fib[i-2];
}
for(i=0;i<40;i++)
{
printf("F%d==%d\n", i, fib);
}
return 0;
}
C#语言程序
public class Fibonacci
{
//NormRen
static void Main(string[] args)
{
int x = 0, y = 1;
for (int j = 1; j < 10; j++, y = x + y, x = y - x)
Console.Write(y + " ");
}
}
Java语言程序
public class Fibonacci
{
public static void main(String[] args)
{
int x=1,y=1;
System.out.println(x+" ");
for(int i=1;i<=20;i++)
{
System.out.println(y+" ");
y=x+y;x=y-x;
}
}
}
[编辑本段]【Pascal语言程序】
递推:
var
fib: array[0..40]of longint;
i: integer;
begin
fib[0] := 1;
fib[1] := 1;
for i:=2 to 39 do
fib[i ] := fib[i-1] + fib[i-2];
for i:=0 to 39 do
write('F', i, '=', fib[i ]);
end.
递归:
function fib(n:integer):longint;
begin
if (n=1) then exit(0);
if (n=2) then exit(1);
fib:=fib(n-2)+fib(n-1);
end;
[编辑本段]【PL/SQL程序】
declare i number :=0;
j number :=1;
x number :=1;
begin
while x<1000
loop
dbms_output.put_line(x);
x:=i+j;
i:=j;
j:=x;
end loop;
end;
[编辑本段]【数列与矩阵】
对于斐波那契数列1,1,2,3,5,8,13…….有如下定义
F(n)=f(n-1)+f(n-2)
F(1)=1
F(2)=1
对于以下矩阵乘法
F(n+1) = 1 1 * F(n)
F(n) 1 0 F(n-1)
它的运算就是
F(n+1)=F(n)+F(n-1)
F(n)=F(n)
可见该矩阵的乘法完全符合斐波那契数列的定义
设1 为B,1 1为C
1 1 0
可以用迭代得到:
斐波那契数列的某一项F(n)=(BC^(n-2))1
这就是斐波那契数列的矩阵乘法定义.
另矩阵乘法的一个运算法则A¬^n(n为偶数)=A^(n/2)* A^(n/2).
因此可以用递归的方法求得答案.
时间效率:O(logn),比模拟法O(n)远远高效。
代码(PASCAL)
{变量matrix是二阶方阵, matrix是矩阵的英文}
program fibonacci;
type
matrix=array[1..2,1..2] of qword;
var
c,cc:matrix;
n:integer;
function multiply(x,y:matrix):matrix;
var
temp:matrix;
begin
temp[1,1]:=x[1,1]*y[1,1]+x[1,2]*y[2,1];
temp[1,2]:=x[1,1]*y[1,2]+x[1,2]*y[2,2];
temp[2,1]:=x[2,1]*y[1,1]+x[2,2]*y[2,1];
temp[2,2]:=x[2,1]*y[1,2]+x[2,2]*y[2,2];
exit(temp);
end;
function getcc(n:integer):matrix;
var
temp:matrix;
t:integer;
begin
if n=1 then exit(c);
t:=n div 2;
temp:=getcc(t);
temp:=multiply(temp,temp);
if odd(n) then exit(multiply(temp,c))
else exit(temp);
end;
procedure init;
begin
readln(n);
c[1,1]:=1;
c[1,2]:=1;
c[2,1]:=1;
c[2,2]:=0;
if n=1 then
begin
writeln(1);
halt;
end;
if n=2 then
begin
writeln(1);
halt;
end;
cc:=getcc(n-2);
end;
procedure work;
begin
writeln(cc[1,1]+cc[1,2]);
end;
begin
init;
work;
end.
[编辑本段]【数列值的另一种求法】
F(n) = [ (( sqrt ( 5 ) + 1 ) / 2) ^ n ]
其中[ x ]表示取距离 x 最近的整数。
[编辑本段]【数列的前若干项】
1、 1
2 、1
3 、2
4 、3
5 、5
6 、8
7 、13
8 、21
9 、34
10、 55
11 、89
12 、144
13 、233
14 、377
15 、610
16 、987
17 、1597
18 、2584
19 、4181
20 、6765
......
亥赐0gA
2009-04-14 · TA获得超过329个赞
知道小有建树答主
回答量:195
采纳率:0%
帮助的人:209万
展开全部
你是要写出斐波那契数列么?
非递归的是:
================分割线
main( )
{
long int f1,f2;
int i;
f1=1;f2=1;
for(i=1;i<=40;i++)
{
printf(%12ld%12ld"'f1,f2);
f1=f1+f2;
f2=f2+f1;
}
}
=======================分割线。下面是递归算法
long int fib(int n)
{int c;
if(n==1)c=1;
else if(n==2)c=2;
else c=fib(n-2)+fib(n-1);
return(c);
}
main( )
{
printf("%12ld",fib(40));
}
===================华丽的分割线。
终于写完了,累死我了。
递归就是函数运算时要调用函数自己本身若干次才能得到运行结果。像这个fib函数,要想算出fib(40)的值就必须算出fib(39)和fib(38)的值,而要就算出fib(39)的值就必须先算出fib(38)和fib(37)的值……以此类推,直到算到fib(3),而fib(3)=fib(2)+fib(1)=1+1=2
而非递归是直接运算出来的。
累死我了,全是自己一个字一个字打出来的啊!!!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
化身智慧
2009-04-16 · TA获得超过237个赞
知道小有建树答主
回答量:130
采纳率:0%
帮助的人:107万
展开全部
你是要写出斐波那契数列吗?
非递归的是:

main( )
{
long int f1,f2;
int i;
f1=1;f2=1;
for(i=1;i<=40;i++)
{
printf(%12ld%12ld"'f1,f2);
f1=f1+f2;
f2=f2+f1;
}
}
下面是递归算法 :
long int fib(int n)
{int c;
if(n==1)c=1;
else if(n==2)c=2;
else c=fib(n-2)+fib(n-1);
return(c);
}
main( )
{ int i;
for(i=1;i<=40;i++)
printf("%15ld",fib(i));
}

递归就是函数运算时要调用函数自己本身若干次才能得到运行结果。像这个fib函数,要想算出fib(40)的值就必须算出fib(39)和fib(38)的值,而要就算出fib(39)的值就必须先算出fib(38)和fib(37)的值……以此类推,直到算到fib(3),而fib(3)=fib(2)+fib(1)=1+1=2
而非递归是根据它的规律直接运算出来的。这就是它们的根本区别。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
犀利还认真丶榜首Q
2009-04-14 · TA获得超过5533个赞
知道大有可为答主
回答量:4152
采纳率:0%
帮助的人:4719万
展开全部
递归的:
unsigned fib(unsigned n)
{
if (n ==0) return 0;
if (n ==1) return 1;
return fib(n-1)+fib(n-2);
}

非递归的:
unsigned fib(unsigned n)
{
unsigned n1 = 0, n2 = 1;
unsigned temp;
if (n ==0) return 0;
if (n ==1) return 1;
for (int i=2; i<= n; ++i)
{
temp = n1+n2;
n1 = n2;
n2 = temp;
}
return n2;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式