算法分析与设计——要求根据给定的正整数n计算第n个斐波那契数。

本文介绍了如何在Java中计算斐波那契数的不同方法,包括交互式界面、迭代、递归、公式和矩阵相乘,同时分析了它们的时间复杂度和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本实验要求根据给定的正整数n计算第n个斐波那契数。
1、设计一个交互界面(例如菜单)供用户选择,如果可能,最好是一个图形化用户界面。
2、利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第几个斐波那契数。(Java: 231-1 for int, 263-1 for long)
3、根据第二步计算的最大的斐波那契数序号n,采用递归方式计算第n个斐波那契数,看其是否可以在1分钟内完成。
4、利用递归算法计算你的计算机能够在30秒内计算出的最大斐波那契数是第几个,利用迭代算法求解同样的问题。
5、利用公式F(n) = [n/sqrt(5)]快速计算第n个斐波那契数,找出出现误差时的最小n值。
6、利用矩阵相乘方法计算第n个斐波那契数。
对于相同的输入n值,比较上述四种方法的基本操作次数,以掌握对数、线性和指数增长率的极大差别。

题目一:

do{
            Scanner s=new Scanner(System.in);
            System.out.println("1,查看斐波那契数列使用long,int类型能够计算的最大n值");
            System.out.println("2,给定n值,求不同方法求得对应n值得斐波那契数值和计算时间");
            System.out.println("3,给定时间,求给定时间能用迭代算法计算到的最大n值");
            System.out.println("4,公式法F(n) = [n/sqrt(5)]求得有误差的最大n值");
            System.out.println("5.用矩阵相乘方法计算第n个斐波那契数");
            System.out.println("请选择你要执行的项目:");
            int chose=s.nextInt();
            switch(chose){...}
            System.out.println("是否返回首页?(1是,0退出程序)");
            con=s.nextInt();

        }while(con==1);

题目二:

public static int fbnq_dd(int n){
    int a[]=new int[n+1];
    a[0]=0;a[1]=1;int result=0;
    if(n==1) return 1;
    for(int i=2;i<n+1;i++){
        a[i]=a[i-1]+a[i-2];
        result=a[n];
    }
    return result;
}
public static int dd_int_compare(){
    int m=1;int n=1;int q=2;//0,1,1,2,3,5,8
    int count=3;
    while(n<q){
        m=n;
        n=q;
        q=m+n;
        count++;
    }
    return count-1;
}

题目三:

public static int fbnq_dg(int n){
    if(n==1||n==2) return 1;
    int result=0;
    if(n>2){
        result=fbnq_dg(n-1)+fbnq_dg(n-2);
    }
    return result;
}
public static int fbnq_dg_time(long time){
    long starttime_dg=System.currentTimeMillis();
    int i=3;
    long endtime_dg=0;
    while(endtime_dg<starttime_dg+time*1000){
        endtime_dg=System.currentTimeMillis();
        i++;
        fbnq_dg(i);
    }
    return i;
}

题目四:

System.out.println("先输入数值time,单位秒");
long time=s.nextLong();
int com_n=fbnq_dg_time(time);
int com_n_dd=fbnq_dd_time(time);
System.out.println(time+"秒能递归计算到第"+com_n+"个斐波那契数");
System.out.println(time+"秒能迭代计算到第"+com_n_dd+"个斐波那契数");
public static int fbnq_dg_time(long time){
    long starttime_dg=System.currentTimeMillis();
    int i=3;
    long endtime_dg=0;
    while(endtime_dg<starttime_dg+time*1000){
        endtime_dg=System.currentTimeMillis();
        i++;
        fbnq_dg(i);
    }
    return i;
}
public static int fbnq_dd_time(long time){
    long starttime_dg=System.currentTimeMillis();
    int i=3;
    long endtime_dg=0;
    while(endtime_dg<starttime_dg+time*1000){
        endtime_dg=System.currentTimeMillis();
        i++;
        fbnq_dd(i);
    }
    return i;
}
long starttime_dd=System.nanoTime();
int result=fbnq_dd(n);
                    long endtime_dd=System.nanoTime();
                    System.out.println("迭代的方式求得f(n):"+result);
                    System.out.println("迭代的方式所用时间为:"+(endtime_dd-starttime_dd)+"纳秒");

                    long starttime_dg=System.nanoTime();
                    int result2=fbnq_dg(n);  //递归运行的位置
                    long endtime_dg=System.nanoTime();
                    System.out.println("递归的方式求得f(n):"+result2);
                    System.out.println("递归的方式所用时间为:"+(endtime_dg-starttime_dg)+"纳秒");

题目五:

public static long fbnq_fn(int n){
    double temp =Math.sqrt(5.0);
    double d_temp=1/temp;
    double result=d_temp*(Math.pow(((1+temp)/2),n)-Math.pow(((1-temp)/2),n));
    return Math.round(result);
}
public static int max_wrong(){
    int i=1;
    while((int)fbnq_fn(i) == fbnq_dd(i)){
        i++;
    }
    return i;
}

题目六:

public static int fbnq_jz(int n){
    int x=0,y=1,z=1,p=2;
    int temp1=0;int temp2=0;
    for(int i=1;i<n;i++){
        temp1=x;
        x=x*0+y*1;
        y=temp1*1+y*1;
        temp2=z;
        z=z*0+p*1;
        p=temp2*1+p*1;
    }
    return y;
}

题目七:
递归:时间复杂度:O(2^N) 空间复杂度:O(N)

迭代:时间复杂度:O(N) 空间复杂度:O(1)

公式:时间复杂度:O(logn)

矩阵:时间复杂度:O(logn)

### 关于西安交通大学算法设计分析课程考试的复习资料 针对西安交通大学(XJTUSE)算法设计分析课程考试,准备充分且有效的复习材料至关重要。对于有本科基础的学生而言,快速回顾相关知识点并集中精力在王道或天勤辅导书籍以及历年真题上是明智的选择[^1]。 对于跨专业的考生,则推荐深入学习《程序设计C语言》,完成书中所有的练习题目来夯实编程能力的基础后再转向上述参考资料和过往考题的学习。特别需要注意的是像大Θ表示法这样的核心概念,即使不在主要备考指南内也应掌握其精确含义及其应用场景,因为这些内容有可能成为高分值试题的一部分[^2]。 #### 利用历年真题提升实战技巧 从大约十月起着手处理往年的考试题目是一个不错的时间节点。尽管部分年份的记忆版本可能存在些许偏差,在解答过程中保持批判性思维有助于识别潜在错误的同时加深理解。最近年的试卷尤其宝贵,它们能够帮助学生超越常规教材所设定的知识边界,培养更加灵活的数据结构思维方式[^3]。 #### 构建稳固的知识体系 除了依赖特定版物外,还应当重视课堂笔记的价值——这不仅是教师授课要点的集合,往往还包括额外拓展的信息。初次浏览时务必澄清每一个疑问之处;随后通过浓缩提炼的方式进一步加工整理成易于记忆的形式,特别是那些关键性的算法逻辑,最好能做到闭卷重现的程度。任何难以消化的概念都值得被标记来以便后续重点攻克[^4]。 #### 综合运用理论联系实际项目经验 面对综合性强的应用型考核,比如要求依据给定情境独立完成整个系统的规划实现过程,不仅考验对据库规范化原理、面向对象设计理念等方面的理解程度,同时也检验能否有效地将抽象的技术要素转化为具体的解决方案。因此平时多加留意课堂教学期间涉及的实际案例研究,并尝试对比不同设计方案之间的优劣差异,甚至探索改进的可能性,都是提高应对这类挑战的有效途径之一[^5]。 ```python # Python代码示例:计算斐波那契序列第n项(动态规划解法) def fibonacci(n): if n <= 0: return "输入正整数" elif n == 1 or n == 2: return 1 fib = [0, 1, 1] for i in range(3, n + 1): next_value = fib[i - 1] + fib[i - 2] fib.append(next_value) return fib[n] print(fibonacci(10)) # 输结果为55 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值