码迷,mamicode.com
首页 > 其他好文 > 详细

斐波拉契序列几种实现

时间:2019-10-28 21:12:28      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:i++   private   ring   cci   pre   图片   二分   for循环   快速   

今天遇到一个面试题:输入n,如果n<=1,f(n)=1,其他f(n)=f(n-1)+f(n-2), 打印f(n)从1到n的值。

public class Fibonacci {

    private int n;
    private StringBuilder sb;
    private String format;

    @Before
    public void init() {
        n = 10;
        sb = new StringBuilder(n);
        format = "f(%s) = ";
    }

 

直接用递归的方式实现:

/**
     * 递归实现
     */
    @Test
    public void recursion() {
        for (int i = 1; i <= n; i++) {
            sb.delete(0, n);
            sb.append(String.format(format, i));
            sb.append(recursion(i));
            System.out.println(sb.toString());
        }
    }

    private int recursion(int n) {
        if (n <= 1) {
            return 1;
        } else {
            return recursion(n - 1) + recursion(n - 2);
        }
    }

测试结果如下:

技术图片

 

面试官说用循环,循环实现:

/**
     * for循环实现
     */
    @Test
    public void fori() {
        if (n <= 1) {
            System.out.println(1);
        }
        int j = 1, k = 1;
        int sum;
        for (int i = 2; i <= n; i++) {
            // f(n)=f(n-1)+f(n-2)
            // 把j作为f(n-1),k作为f(n-2)
            sum = j + k;
            k = j;
            j = sum;

            sb.delete(0, n);
            sb.append(String.format(format, i));
            sb.append(sum);
            System.out.println(sb.toString());
        }
    }

测试结果如下:

技术图片

 

他说代码可以更加精简、高效,再次修改:

/**
     * for循环更高效实现
     */
    @Test
    public void forEfficient() {
        if (n <= 1) {
            System.out.println(1);
        }
        int temp = 1;
        int sum = 1;
        for (int i = 2; i <= n; i++) {
            // f(n)=f(n-1)+f(n-2)
            // 此时把sum作为f(n-1),temp作为f(n-2)
            sum = sum + temp;
            // 计算后sum就是f(n)
            // temp = f(n-1) = f(n) - f(n-2)
            temp = sum - temp;

            sb.delete(0, n);
            sb.append(String.format(format, i));
            sb.append(sum);
            System.out.println(sb.toString());
        }
    }

测试结果如下:

技术图片

 

后面几面的编程题相关问题:

给一个无序数组,找出第K个大的数

比如23, 5, 7, 2,2大的数就是7

快速排序partition函数,比如10个数,找第5大的数,进行降序排列,在一次快排后,返回的下标假如为2就是这个数最终的位置,并且这个左边的所有的数都比它大,右边的所有数都比他小,然后就找3-9的数进行partition……

如果有有序数组相关的问题,应该要想到二分查找,根据数组下标二分!

很多编程题,校招时感觉简单,社招需要想一想才能做出来。

 

斐波拉契序列几种实现

标签:i++   private   ring   cci   pre   图片   二分   for循环   快速   

原文地址:https://www.cnblogs.com/theRhyme/p/11755154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!