我们在前面的黄金分隔算法中,提到过斐波那契数列的问题,最后的作业是计算斐波那契数列第N项的值,今天给小朋友们上课的时候有小朋友想看到结果,于是有图就写出来,大家可以参考一下。
cls
input n
a=1:b=1
if n mod 2=0 then x=(n-2)/2 else x=int((n-2)/2)+1
for i=1 to x
a=a+b
b=a+b
next i
if n=1 or n=2 then print 1 else if n mod 2=0 then print b else print a
end


此处需要注意两个if语句的功能,在“黄金分隔算法”一文的末尾给大家提出这个问题的时候,需要注意问题的关键有两点:
1、需要循环几次?(不可忘记了前面已经列出的两项)
2、N是奇数还是偶数?
上面的程序中,第一个if主要是解决第一个问题,即循环多少次的,而第二个if主要是解决是奇数还是偶数的问题,从而选择性的输出(顺带,我们判读了一下是否是前两项)。
此程序中第一个 if 中n为奇数的循环次数我加上了 int 函数 方便大家理解,如果你想省略,可以简写成 x=(n-2)/)+1,并不影响结果,但可能理解起来要费点脑筋了,或者改写成一个四舍五入的写法 x=int((n-2)/2+0.5)
当然,此程序和前面的几个例子一样书写的时候力求完备,所以用到了不少辅助语句,增加了理解的难度,如果问题直接问请列出多少项,实现起来要简单些。
如果说求偶数个斐波那契数列的值,如求斐波那契数列的前30项的算法:
cls
a=1:b=1
print a,b,
for i=1 to (30-2)/2
a=a+b
b=a+b
print a,b,
next i
end

而若是奇数项的斐波那契数列也不会太复杂,如求斐波那契数列前21项的算法:
cls
a=1:b=1
print a,b,
for i=1 to int((21-2)/2)
a=a+b
b=a+b
print a,b,
next i
print a+b
end
同样,此处的int函数可以不用,直接写成 (21-2)/2 不过大家是否很方便的理解,我就不得而知了。
值得注意的是,我们的for循环中输出了多少项?18项,加上前面的两项才20项,所以最后一项我们直接print a+b,这样是最方便的,当然你也可以将是否达到最后放在循环当中,输出最后一项的值。
cls
a=1:b=1
print a,b,
for i=1 to int((21-2)/2)
a=a+b
b=a+b
print a,b,
if i=int((21-2)/2) then print a+b
next i
end
或者,我们将最后一项的输出也集成到输出当中,只需要在next之前决定最后的时候只输出出一个即可,不过需要一个 +1 ,大家可以考虑下为什么。
cls
a=1:b=1
print a,b,
for i=1 to int((21-2)/2)+1
a=a+b
b=a+b
if i=int((21-2)/2)+1 then print a else print a,b
next i
end
不过后两种的程序的开销加大了许多(每次循环都要判断i是否达到了最大),不建议这么做,只是开拓我们的思路,解决问题的多种实现方法会使我们在面对复杂程序要求的时候更游刃有余。
今天讨论的问题说的直白一点还是循环和判断的问题,斐波那契的两项相加会使我们对循环的理解更加透彻,不再单单是变化一个或者两个变量,而是一种复合变化。
好,今天的讨论到此为止,若你发现本文有错误的地方,或者不足的地方请你留言,若你有什么问题也可以留言,更多Qbasci的内容请看Qbasic教程……
本文是 有图 原创,原地址为 http://www.utosee.com/post/478.html分类:电脑相关 关键字:qbasic
上一篇:蜘蛛牌游戏下载 | 下一篇:给大一新生的建议
搜索关于 斐波那契数列第n项的求法 的更多内容
