Java面试题:小白不得不懂的斐波那契数列

很长一段时间里,我都非常疑惑:“我写的技术文章不差啊,有内容的同时还很有趣,不至于每篇只有区区几十个人读啊?为什么有些内容简单到只有一行注册码的文章浏览量反而轻松破万?”这样的疑惑如鲠在喉啊!写技术博客做分享的人,有几个真心实意的说只写给自己看的?这无非是写出来后没人看的自我安慰(不好意思,我就属于这种人,/(ㄒoㄒ)/~~)。

但就在昨天晚上,我终于恍然大悟;技术交流群里有一个叫涛涛的小伙伴用几句通俗易懂的道理就点醒了我:“高深的文章,看懂的人少,适合高层;像只有注册码的文章,反而是大众所需,浏览量非常高,因为只要是初学编程的,几乎都用得着! 就像买房子一样,普通商品房买的人最多,复式套房要少一些,别墅就更少了——而你这样的‘专家’写出来的文章就相当于在卖别墅。”

哦,有一种醍醐灌顶的感觉,有没有?假如把编程也看做是金字塔的话,那咱真心实意的说,咱的水平顶多也就处在中层偏下的水平,强装专家写出来的文章注定会“高不成低不就”——造成这种局面真的非常尴尬,在乎高品质文章的读者就会吐槽:“这货就是一个逗比”,然后笑一笑走了;不在乎高品质想找干货的读者也会不满意:“这货写出来的文章有点‘高深’,我都看不懂啊”,然后呵呵一声也走了。想一想,真是尴尬极了!

像我这种写不出来高端文章,又想要点浏览量来安慰自己的写作者,怎么办呢?

还是写一些有趣的、入门级的干货内容吧!比如说今天这篇《Java流程控制语句,不是选择就是循环 | 斐波那契数列》。

Java中涉及控制执行流程的关键字有if-elsewhile-do-whileforswitchreturnbreakcontinue等等;我们来挑几个来说道说道。

1、要么生,要么死

在网络上看到这么一句话:“人生不过三条路,要么生,要么死,要么生不如死”,经典啊!这句话套用在if-else语句上也非常的贴切,不信你看:

只有一个if语句

if (布尔表达式) {
// 语句
}

或者一个if语句加上一个else语句

if (布尔表达式) {
// 语句
} else {
// 语句
}

或者一个if语句加上一个else if语句,再加一个else语句

if (布尔表达式) {
// 语句
} else if (布尔表达式) {
// 语句
} else {
// 语句
}

2、想清楚再走,还是先走一步再说

while和do-while语句常用来控制不确定次数的循环语句,除了形式上稍显不同之外,do-while会比while多执行一次(同等条件下哦);其格式如下:

while

while(布尔表达式) {
// 语句
}

do-while

do {
// 语句
} while(布尔表达式)

3、次数确定请用for

for循环有两种形式,分别如下:

①、创建int变量的形式(可以主动指定循环次数,比如说可以把i < strs.length()改为i < 3,这样就只循环3次而不是4次)

String [] strs = {"沉", "默", "王", "二"};
for(int i = 0; i < strs.length(); i++) {
    String str = strs[i];
}

稍微解释一下:第一次循环之前要进行变量初始化int i = 0,随后进行条件测试i < strs.length(),然后执行语句String str = strs[i];,语句结束后进行“步进”i++

②、俗称“foreach”的形式(不必指定下标就能取出元素)

String [] strs = {"沉", "默", "王", "二"};
for (String str : strs) {
}

也稍微解释一下:冒号:之前声明了String类型的变量str;冒号:之后是数组strs;在执行循环的时候,Java内部会依次取出数组strs中的每一个元素,然后赋值给变量str,直到最后一个元素。

4、可以switch字符串了

当if-else的条件超出三个以上时(看起来有点臃肿),可使用switch语句来进行替代。switch语句的形式如下:

switch(condition) {
    case calue1 :
        // 语句
        break;
    case calue2 :
        // 语句
        break;
    case calue3 :
        // 语句
        break;
    default :
        // 语句
}

使用switch语句时需要特别注意的就是break关键字,该用的地方一定不要忘记! 否则,switch语句就会触发下一个case分支,而忽略掉没有break关键字的当前分支。

从Java SE 7 开始,switch语句支持字符串形式的条件了;在这之前,switch只支持类型为char、byte、short或int的常量表达式,以及枚举常量。

5、斐波那契数列

斐波那契数列几乎是每一个学习编程的人都绕不开的一道笔试题;斐波那契数列是“斐波那契”(伟大的数学家)在养兔子时候发现的非常有意思的数列:

第一个月小兔子没有繁殖能力,所以还是一对; 两个月后,生下一对小兔总数共有两对; 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对; ……依次类推可以列出下表:

人们发现自然规律的能力好强,有没有?怎么使用Java实现斐波那契数列呢?

规律:第一个数+第二个数=第三个数,第二个数+第三个数=第四个数,第三个数+第四个数=第五个数,以此类推

具体代码:

package com.cmower.java_demo;

public class Fibonacci {

    public static void main(String[] args) {
        int start = 1;
        int next = 1;
        System.out.print(start + "、" + next + "、");

        // 从3开始到第num个斐波那契数
        for (int i = 3; i <= 12; i++) {
            int last = start + next;
            System.out.print(last + "、");

            start = next;
            next = last;
        }
        System.out.println();

        // 通过迭代计算,效率很低
        for (int i = 1; i <= 12; i++) {
            System.out.print(getFibonacci(i) + "、");
        }
    }

    private static int getFibonacci(int index) {
        if (index == 1 || index == 2) {
            return 1;
        }

        return getFibonacci(index - 1) + getFibonacci(index - 2);

    }

}

思路1:先指定前两个数,然后在for循环中计算接下来的数,然后用后一个数替换前一个。 思路2:通过迭代完成,下标是1或者2的时候返回1,其余的数等于前一个数和前前一个数的和。


原文发布于微信公众号 - 沉默王二(cmower)

原文发表时间:2018-11-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券