斐波那契数列c语言调用函数,函数指针调用斐波那契数列问题

2014-01-16 回答

斐波那契数列的通项公式: f(n)=0 当n=0, f(n)=1 当n=1,2 f(n)=f(n-1)+f(n-2) 当n>2 又叫“比内公式”,是用无理数表示有理数的一个范例 f(n)=1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n} 似乎你要的是个计算机的程序填空,不过我没看懂那是什么语言的程序 第2个通项明显不适合计算机求解,编程要用第一个,主要是递归的问题 下面是百度查找到的哦: 【斐波那挈数列通项公式的推导】 斐波那契数列:1,1,2,3,5,8,13,21…… 如果设f(n)为该数列的第n项(n∈n+)。那么这句话可以写成如下形式: f(1)=f(2)=1,f(n)=f(n-1)+f(n-2) (n≥3) 显然这是一个线性递推数列。 通项公式的推导方法一:利用特征方程 线性递推数列的特征方程为: x^2=x+1 解得 x1=(1+√5)/2, x2=(1-√5)/2. 则f(n)=c1*x1^n + c2*x2^n ∵f(1)=f(2)=1 ∴c1*x1 + c2*x2 c1*x1^2 + c2*x2^2 解得c1=1/√5,c2=-1/√5 ∴f(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}【√5表示根号5】 通项公式的推导方法二:普通方法 设常数r,s 使得f(n)-r*f(n-1)=s*[f(n-1)-r*f(n-2)] 则r+s=1, -rs=1 n≥3时,有 f(n)-r*f(n-1)=s*[f(n-1)-r*f(n-2)] f(n-1)-r*f(n-2)=s*[f(n-2)-r*f(n-3)] f(n-2)-r*f(n-3)=s*[f(n-3)-r*f(n-4)] …… f(3)-r*f(2)=s*[f(2)-r*f(1)] 将以上n-2个式子相乘,得: f(n)-r*f(n-1)=[s^(n-2)]*[f(2)-r*f(1)] ∵s=1-r,f(1)=f(2)=1 上式可化简得: f(n)=s^(n-1)+r*f(n-1) 那么: f(n)=s^(n-1)+r*f(n-1) = s^(n-1) + r*s^(n-2) + r^2*f(n-2) = s^(n-1) + r*s^(n-2) + r^2*s^(n-3) + r^3*f(n-3) …… = s^(n-1) + r*s^(n-2) + r^2*s^(n-3) +……+ r^(n-2)*s + r^(n-1)*f(1) = s^(n-1) + r*s^(n-2) + r^2*s^(n-3) +……+ r^(n-2)*s + r^(n-1) (这是一个以s^(n-1)为首项、以r^(n-1)为末项、r/s为公差的等比数列的各项的和) =[s^(n-1)-r^(n-1)*r/s]/(1-r/s) =(s^n - r^n)/(s-r) r+s=1, -rs=1的一解为 s=(1+√5)/2, r=(1-√5)/2 则f(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n} 【c语言程序】 main() { long fib[40] = {1,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; } 【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. 【数列与矩阵】 对于斐波那契数列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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值