博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第十二周项目3-用递归方法求解(二)
阅读量:6957 次
发布时间:2019-06-27

本文共 3242 字,大约阅读时间需要 10 分钟。

编制递归函数fib(int n)返回第n个Fibnacci数,以此输出Fibnacci序列的第20个数

关于Fibnacci:

Fibnacci数列又称斐波那契数列黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

递推公式

斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...[1] 
如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式:[1] 
显然这是一个线性递推数列。[1] 
通项公式
(如上,又称为“比内公式”,是用无理数表示有理数的一个范例。)
注:此时a1=1,a2=1,an=a(n-1)+a(n-2)(n>=3,n∈N*)
通项公式推导
方法一:
利用特征方程(线性代数解法)
线性递推数列的特征方程为:
  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=1  
  解得C1=1/√5,C2=-1/√5
  ∴F(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}【√5表示根号5】
方法二:待定系数法构造等比数列1(初等代数解法)
设常数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⑶-r*F⑵=s*[F⑵-r*F⑴]。
联立以上n-2个式子,得:
F(n)-r*F(n-1)=[s^(n-2)]*[F⑵-r*F⑴]。
∵s=1-r,F⑴=F⑵=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⑴。
= 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)=(√5/5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}。

方法三:待定系数法构造等比数列2(初等代数解法)
已知a1=1,a2=1,an=a(n-1)+a(n-2)(n>=3),求数列{an}的通项公式。
解 :设an-αa(n-1)=β(a(n-1)-αa(n-2))。
得α+β=1。
αβ=-1。
构造方程x^2-x-1=0,解得α=(1-√5)/2,β=(1+√5)/2或α=(1+√5)/2,β=(1-√5)/2。
所以。
an-(1-√5)/2*a(n-1)=(1+√5)/2*(a(n-1)-(1-√5)/2*a(n-2))=[(1+√5)/2]^(n-2)*(a2-(1-√5)/2*a1)`````````1。
an-(1+√5)/2*a(n-1)=(1-√5)/2*(a(n-1)-(1+√5)/2*a(n-2))=[(1-√5)/2]^(n-2)*(a2-(1+√5)/2*a1)`````````2。
由式1,式2,可得。
an=[(1+√5)/2]^(n-2)*(a2-(1-√5)/2*a1)``````````````3。
an=[(1-√5)/2]^(n-2)*(a2-(1+√5)/2*a1)``````````````4。
将式3*(1+√5)/2-式4*(1-√5)/2,化简得an=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}。

方法四:母函数法。
对于斐波那契数列{a(n)},有a(1)=a(2)=1,a(n)=a(n-1)+a(n-2)(n>2时)
令S(x)=a(1)x+a(2)x^2+……+a(n)x^n+……。
那么有S(x)*(1-x-x^2)=a(1)x+[a(2)-a(1)]x^2+……+[a(n)-a(n-1)-a(n-2)]x^n+……=x
.因此S(x)=x/(1-x-x^2).
不难证明1-x-x^2=-[x+(1+√5)/2][x+(1-√5)/2]=[1-(1-√5)/2*x][1-(1+√5)/2*x].
因此S(x)=(1/√5)*{x/[1-(1+√5)/2*x]-x/[1-(1-√5)/2*x]}.
再利用展开式1/(1-x)=1+x+x^2+x^3+……+x^n+……
于是就可以得S(x)=b(1)x+b(2)x^2+……+b(n)x^n+……
其中b(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}.
因此可以得到a(n)=b(n)==(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}

运行代码:

/* *Copyright (c) 2014,烟台大学计算机学院 *All gight reserved. *文件名称:temp.cpp *作者:邵帅 *完成时间:2014年11月15日 *版本号:v1.0*/#include
using namespace std;int fib(int n);int main(){ cout<
<
运行结果:

输入一个整数n,要求输出对应的二进制形式

二进制整数n转换为二进制的方法是“除2取余法”,即将n除以2后得到的余数,由后到前“串”起来,得到对应的二进制数,如图。

运行代码:

/* *Copyright (c) 2014,烟台大学计算机学院 *All gight reserved. *文件名称:temp.cpp *作者:邵帅 *完成时间:2014年11月15日 *版本号:v1.0*/#include 
using namespace std;void dec2bin(int n);int main(){ int n; cout<<"请输入一个整数:"; cin>>n; cout<
<<"对应的二进制形式为:"; dec2bin(n); cout<
运行结果:

心得:关于递归函数的使用,真的是考验逻辑性的时候到了,不仅看到一个程序需要构建出它的运行方式,还要勾勒出它每一步的运行轨迹,才能正确的使用递归函数,最重要的,还是逻辑性吧。

@ Mayuko

转载于:https://www.cnblogs.com/mayuko/p/4567618.html

你可能感兴趣的文章
auto_ptr
查看>>
Windows系统的消息机制
查看>>
谈谈java中静态变量与静态方法在有继承关系的两个类中调用
查看>>
基础练习 十六进制转八进
查看>>
人工智能赢了人类,那又如何?
查看>>
Shell中字符串、数值的比较
查看>>
内存管理
查看>>
Arg_parser 1.8 发布,C++ 参数解析库
查看>>
DAC--解决windows验证无法登陆的问题
查看>>
[CALayer release]: message sent to deallocated instance iOS内存过度释放问题
查看>>
WPF界面设计技巧(4)—自定义列表项样式
查看>>
git push的时候每次都要输入用户名和密码的问题解决
查看>>
精益开发实战:用看板管理大型项目
查看>>
hiho_1138_island_travel
查看>>
Redis内存存储结构分析
查看>>
love2d教程13--图形界面
查看>>
POJ 1276 Cash Machine
查看>>
C语言中 struct成员变量顺序对内存的占用
查看>>
POJ1291-并查集/dfs
查看>>
移动办公首选!电商热卖轻薄本高低该怎么选?
查看>>