A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© pengwei1989 中级黑马   /  2015-9-18 15:23  /  669 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

题目:求斐波那契数列第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]);
                }

        }
}
请各位大神指教。。。       
               

12 个回复

倒序浏览
递归方法:
以前用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;
}
回复 使用道具 举报
再来个迭代,楼主的代码不够简洁,也是用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;
}
回复 使用道具 举报
我是这么写的
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);
                }
        }

}
回复 使用道具 举报 1 0
这个还是可以
回复 使用道具 举报
芝麻糊 发表于 2015-9-18 17:38
递归方法:
以前用C++写的,不过应该不影响观看, cout

让我想起熟悉的#include<iostream>了,哈哈
回复 使用道具 举报
hei军 中级黑马 2015-9-23 15:34:31
7#
这是就业班的测试题吗
回复 使用道具 举报
非常不错,学习了,复习了大一的知识。
回复 使用道具 举报
看到 用了数组。for循环, if(表达式) {输出语句}  else  的知识点
回复 使用道具 举报
太麻烦了,可以直接递归搞定,除前两项外,每一项都是前两项的和:fun(n)=fun(n-1)+fun(n-2);第一项和第二项是递归的出口。
回复 使用道具 举报
斐波那契数列是什么东西。。这是就业班入学的题么?怎么看都不觉得像基础班的。。
回复 使用道具 举报
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));
}
}
回复 使用道具 举报
谢谢分享 学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马