Java之使用分治算法解决斐波那契数列问题(Fibonacci Again)


前言

分治算法 所谓分治就是指的分而治之即将较大规模的问题分解成几个较小规模的问题通过对较小规模问题的求解达到对整个问题的求解当我们将问题分解成两个较小问题求解时的分治方法称之为二分法
分治的基本思想是将一个规模为n的问题分解为k个规模较小的子问题这些子问题互相独立且与原问题相似找出各部分的解然后把各部分的解组合成整个问题的解


提示:以下是本篇文章正文内容,仅可供参考

一、实验目的

   练习使用分治算法解决实际问题(使用Java语言实现)。

二、实验内容

【问题描述】

  有这样一种斐波那契数列:F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2)。

【输入】

  输入由一系列行组成,每行包含一个整数 n。 (n < 1,000,000)

【输出】

  如果 F(n)能被3整除,则打印单词“yes”。

  如果不能,则打印“no”。

【样例输入】

  0

  1

  2

  3

  4

  5

【样例输出】

  no

  no

  yes

  no

  no

  no

二、思路分析

在使用分治算法时,将较大规模的问题分解成几个较小规模的问题通过对较小规模问题的求解达到对整个问题的求解。
在本题中,通过找规律的方式,发现该斐波那契数列生成的每八个数的第二个和第六个可被3整除,因此只需要判断要求判断的数是否符合规律即可。

nf(x)余数
071
1112
2180
3292
4472
5761
61230
71991
83221
95212
108430
1113642
1222072
1335711
1457780
1593491

————————————————

1.构建一个存储结果的类

代码如下:

package OperaTion;

public class Result {//构建一个结果的类
    public String out;//用于存储判断后的结果YES/NO。
    public Result(){
    }
}

2.编写相关处理函数

代码如下:

package OperaTion;

import java.util.Scanner;

public class Method {

    private int i=0;
    Result[] result;

    public void judge(int n){//通过对该斐波那契数列的研究
        result[i]=new Result();//初始化数组
        if(n%8==2||n%8==6){//每八个数是一个循环数列
            result[i].out="yes";//第二个和第六个可以被3整除
        }else{
            result[i].out="no";
        }
        i++;//将结果存入结果数组中
    }

    public void menu(){//菜单函数
        System.out.print("请输入将要运算的数的个数:");
        Scanner scanner =new Scanner(System.in);
        int x =scanner.nextInt();
        result=new Result[x];//初始化数组
        int n;
        for(int i=0;i<x;i++){
            System.out.print("请输入第"+(i+1)+"个数:");
            n =scanner.nextInt();
            judge(n);//调用判断函数
        }
    }

    public void getresult(){//输出存入结果数组中的结果
        System.out.println("能否被3整除:");
        for(int i=0;i<result.length;i++){
            System.out.print("第"+(i+1)+"个数:");
            System.out.println(result[i].out);
        }
    }
}


3.编写主函数

package Domain;
import OperaTion.Method;

public class domain {
    public static void main(String[] args){
        Method method =new Method();
        method.menu();//菜单函数
        method.getresult();//输出结果
    }
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了分治算法在本例题中的运用,斐波那契数列是一种很有趣的数列,能够探索相关规律进行编写程序,也是一种不错的体验。

内容仅供参考,希望各位要摘抄的小伙伴能够进行改写,拓宽思路!

完整工程文件请关注以下公众号进行获取:在这里插入图片描述

### 斐波那契数列的 RISC-V 实现 斐波那契数列是一种经典的递归算法,在 RISC-V 架构下的实现可以通过汇编语言完成。以下是基于 RISC-V 汇编语言的一个简单示例,用于计算第 n 项斐波那契数值。 #### 示例代码 以下是一个简单的 RISC-V 汇编程序,实现了斐波那契数列的递归计算: ```assembly # Fibonacci sequence implementation in RISC-V assembly language .data result_msg: .asciz "Fibonacci result is %d\n" .text .globl fib fib: # Base case: if n == 0 or n == 1, return n li t0, 0 # Load immediate value 0 into temporary register t0 beq a0, t0, base_case_0 # If input (a0) equals 0, jump to base_case_0 li t0, 1 # Load immediate value 1 into temporary register t0 beq a0, t0, base_case_1 # If input (a0) equals 1, jump to base_case_1 # Recursive case: calculate fib(n-1) and fib(n-2) addi sp, sp, -8 # Allocate space on the stack for two values sw ra, 4(sp) # Save return address onto the stack sw s0, 0(sp) # Save s0 (used as a temporary variable) addi a0, a0, -1 # Decrement argument by 1 jal fib # Call fib recursively with decremented argument lw s0, 0(sp) # Restore saved s0 from the stack mv s0, a0 # Move returned value of fib(n-1) into s0 lw ra, 4(sp) # Restore return address addi sp, sp, 8 # Deallocate stack space addi a0, a0, -2 # Decrement original argument by 2 jal fib # Call fib again with further decremented argument add a0, s0, a0 # Add results of fib(n-1) and fib(n-2), store in a0 jr ra # Return to caller base_case_0: li a0, 0 # Set result to 0 jr ra # Return to caller base_case_1: li a0, 1 # Set result to 1 jr ra # Return to caller main: li a0, 10 # Input value (n = 10) jal fib # Calculate fibonacci(10) la a0, result_msg # Load address of format string ecall # Print result using system call ``` 上述代码展示了如何在 RISC-V 中通过递归来实现斐波那契数列的计算[^3]。`fib` 函数接受输入 `a0` 并返回相应的斐波那契值。对于基线情况 (`n = 0` 或 `n = 1`),函数直接返回输入值;而对于其他情况,则调用自身两次分别计算前两项并相加得到最终结果。 #### 关键点解析 1. **栈管理**: 在递归过程中,为了保存中间状态(如寄存器值和返回地址),需要合理利用堆栈空间。这里使用了 `sp` 寄存器作为堆栈指针,并通过 `sw` 和 `lw` 指令存储/恢复数据。 2. **伪指令应用**: 尽管此代码未显式涉及伪指令,但在实际开发中可以考虑引入诸如 `nop`, `mv` 等简化复杂度的操作。 3. **性能优化**: 上述方法虽然直观易懂,但由于重复子问题的存在可能导致效率低下。可通过动态规划或记忆化技术改进其时间复杂度[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值