斐波那契數(shù)列是在學編程期間最先接觸的到的知識钠四,也是思維拓展比較多的一個知識點跪楞,很重要。
我的理解
斐波那契數(shù)列缕碎,常用的有遞歸池户,但是對于數(shù)據(jù)大的數(shù)字,那么它的運行時間便比較長校焦,因為是大O了。所以要用平常的for循環(huán)的方式進行傳統(tǒng)的賦值熏迹,這個樣子是O(n)凝赛。
這里寫的都是比較簡單的題目坛缕,內(nèi)部也有很深的東西可以探索。
第一題:斐波那契數(shù)列
題目描述
大家都知道斐波那契數(shù)列赚楚,現(xiàn)在要求輸入一個整數(shù)n,請你輸出斐波那契數(shù)列的第n項左胞。n<=39
對于這個題,一開始老師講的是結(jié)合遞歸烤宙,最經(jīng)典的應(yīng)該就是兔子生一窩兔子的題。但是服猪,遞歸對于時間消耗很大拐云。
遞歸寫的
int Fibonacci1(int n) {
if (n <= 2 && n > 0) {
return 1;
}else if(n == 0){
return 0;
}else{
return Fibonacci1(n-1)+Fibonacci1(n-2);
}
}
普通思路for循環(huán)寫的
int Fibonacci(int n) {
int a1 = 0, a2 = 1;
if (n == 0) {
return 0;
}else if(n == 1){
return 1;
}else{
for (int i = 1; i < n; i++) {
int temp = a2 + a1;
a1 = a2;
a2 = temp;
}
return a2;
}
}
第二題:跳臺階
題目描述
一只青蛙一次可以跳上1級臺階,也可以跳上2級叉瘩。求該青蛙跳上一個n級的臺階總共有多少種跳法。
思路:
1階——1種 1
2階——2種 1 2
3階——3種 111 12 21
4階——5種 1111 112 211 22
5階——8種 11111 1112 1211 2111 1121 122 212 221
在這里就不寫公式了备闲,很好就推出來了捅暴。
遞歸
int jumpFloor1(int number) {
if(number == 1){
return 1;
}else if (number == 2){
return 2;
}else{
return jumpFloor1(number-1)+jumpFloor1(number-2);
}
}
for循環(huán)
int jumpFloor(int number) {
int a1 = 1;
int a2 = 2;
if(number == 1){
return 1;
}else if (number == 2){
return 2;
}else{
for (int i = 2; i < number; i++) {
int temp = a1+a2;
a1 = a2;
a2 = temp;
}
return a2;
}
}
第三題:變態(tài)跳臺階
題目描述
一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級泻骤。求該青蛙跳上一個n級的臺階總共有多少種跳法梧奢。
思路:
1階——1種 1
2階——2種 11 2
3階——4種 111 12 21
4階——8種 1111 112 121 211 22 31 13 4
5階——16種 11111 11112 1121 1211 2111 122 212 221 32 23 41 14 5
遞歸
int jumpFloorII1(int number) {
int a1 = 0, a2 = 1;
if (number == 0) {
return a1;
}else if (number == 1){
return a2;
}else{
return jumpFloorII1(number-1)*2;
}
}
for循環(huán)
int jumpFloorII(int number) {
int a1 = 0, a2 = 1;
if (number == 0) {
return a1;
}else if (number == 1){
return a2;
}else{
for (int i = 1; i < number; i++) {
int temp = a2*2;
a2 = temp;
}
return a2;
}
}
這里還有一個發(fā)散思維,就是利用二進制趋惨,通過左位移來做
int jumpFloorII2(int number) {
return 1<<--number;
}
舉例說明
例如給的值是3惦蚊,運算符順序是先--然后<<。
所以:1二進制是0001蹦锋,左位移2,就是低位左移2位葛圃,為0100,值為十進制的4库正。
同理來個5,0001洞渤,左位移4属瓣,為0001 0000,算一算抡蛙,是0,2粗截,4,8绽榛,16婿屹,高位為1,換算成10進制為16昂利,正確。犁苏。扩所。