黑马程序员技术交流社区

标题: 一道入学测试题 [打印本页]

作者: pengwei1989    时间: 2015-9-18 15:23
标题: 一道入学测试题
题目:求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55
我是这么写的
class  haha
{
        public static void main(String[] args)
        {
                int arr[]=new int[30];
                arr[0]=1;
                arr[1]=1;
               
                System.out.print(arr[0]+","+arr[1]);
                for (int x=2;x<29 ;x++ )
                {
                        arr[x]=arr[x-2]+arr[x-1];
                        if (x==28)
                       
                        System.out.print(","+arr[28]);

                        else

            System.out.print(","+arr[x]);
                }

        }
}
请各位大神指教。。。       
               
作者: 芝麻糊    时间: 2015-9-18 17:38
递归方法:
以前用C++写的,不过应该不影响观看, cout << 是打印
int Fib(int n)
{
        if(1 == n || 2 == n)
        {
                return 1;
        }
        else
        {
                return Fib(n-1) + Fib(n-2);
        }
}

int main()
{
        cout << Fib(30);
        return 0;
}
作者: 芝麻糊    时间: 2015-9-18 17:41
再来个迭代,楼主的代码不够简洁,也是用C++写的,
int a[n+5]  是以前做题时担心出现数组越界耽误时间 所以总是把数组定义略大一些,请无视
int main()
{
        int n = 30;
        int a[n+5];
        a[0] = 0;
        a[1] = 1;
        for(int i=2;i<=n;i++)
        {
                a[i] = a[i-1] + a[i-2];
        }
        cout << a[n];
        return 0;
}
作者: xiaoya0o0o    时间: 2015-9-18 18:46
我是这么写的
public class Test1 {

        public static void main(String[] args) {
                /*
                 * 思路:
                 * 从前10项可以看出,第一项和第二项都为1,而之后的都是它的前两项之和,
                 * 比如:第三项对应的数字=第一项+第二项,第四项对应的数字=第三项+第二项等等
                 * 所以从上面分析可知用递归比较简单
                 * 递归:其实就是功能的重复使用,但是每次该功能被调用参数都变化(使用了上一次运算的结果)
                 * 1,函数自身调用自身。
                 * 2,一定要定义条件,否则.StackOverflowError。栈溢出。
                 * 3,注意:递归次数过来容易溢出。
                 */
                 // 定义一个变量,并给其赋值30
                 int num = 30;
                 // 定义一个打印的方法,并带参数
                 print(num);
        }
        /**
         * 打印每一项对应的值,传入的参数为int类型
         * @param num
         *
         */
        private static void print(int num) {
                // 定义一个变量
                int j = 0;
                // 循环遍历出num值中的每一项
                for(int i=1;i<num;i++){
                        // 定义一个方法,传一个实参,用于计算,并将计算的结果返回
                        j = show(i);
                        // 将每一项和相对应的结果打印出来
                        System.out.println("第 "+i+" 项"+",对应的数字是  "+j);
                }
        }
        /**
         * 计算具体的每一项对应的值,传入的参数为int类型,并返回一个int类型的值
         * @param n
         * @return
         */
        private static int show(int n) {
                // 判断,当n=1和n=2的时候值为1
                if(n==1 || n==2){
                        return 1;
                }else{
                        // 如果n>2的时候,它的值为紧挨着它的前两项的和
                        return show(n-1)+show(n-2);
                }
        }

}

作者: 夏木南生    时间: 2015-9-18 22:01
这个还是可以
作者: 安仔    时间: 2015-9-18 22:22
芝麻糊 发表于 2015-9-18 17:38
递归方法:
以前用C++写的,不过应该不影响观看, cout

让我想起熟悉的#include<iostream>了,哈哈
作者: hei军    时间: 2015-9-23 15:34
这是就业班的测试题吗

作者: heshiwei    时间: 2015-9-23 16:02
非常不错,学习了,复习了大一的知识。
作者: 迷茫不堪的年纪    时间: 2015-9-23 16:54
看到 用了数组。for循环, if(表达式) {输出语句}  else  的知识点
作者: 流觞曲水    时间: 2015-9-23 21:14
太麻烦了,可以直接递归搞定,除前两项外,每一项都是前两项的和:fun(n)=fun(n-1)+fun(n-2);第一项和第二项是递归的出口。
作者: StormPeng    时间: 2015-9-23 21:16
斐波那契数列是什么东西。。这是就业班入学的题么?怎么看都不觉得像基础班的。。
作者: 劲爆对策    时间: 2015-9-23 22:07
public class SLT {
//        递归方法
        public static int feibo(int n){
//                这是出口
                if(n==1||n==2){
                        return 1;
                }
//                这是规律
                return n=feibo(n-1)+feibo(n-2);
               
        }
       
       
public static void main(String[] args) {
//        调用
        System.out.println(feibo(7));
}
}

作者: lostyou    时间: 2015-9-23 22:21
谢谢分享 学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2