「已注销」 2023-04-02 20:41 采纳率: 100%
浏览 145
已结题

如何使用RISC-V对斐波那契递归算法进行优化

因为递归需要的时间很长且重复调用,因此要对其进行优化
如何对以下代码进行优化
优化后仍然是递归算法

a0: parameter, initially n

s0: placeholder for parameter n

s1: fib(n-1)

s2: fib(n-2)

fib部分

fib:
    ##Part 1. Prologue as a callee
    addi  sp,  sp,  -16     #create its stack frame 
    sw    ra,  12(sp)       #save the return address to caller
    sw    s0,  8(sp)        #callee saved registers
    sw    s1,  4(sp)       
    sw    s2,  0(sp) 
    
    ##Part 2. Main body
    mv    s0,  a2            #addi  s0,  a2,  0  (parameter n saved in s0)
    li    t0,  2            #addi  t0,  x0,  2  (t0 = 2)
    blt   s0,  t0, fib_base #if n < 2, do the base case

    addi   a2,  s0, -1        #compute fib(n-1)
    jal   fib               #jal ra, fib
    mv    s1,  a0            #s1 = fib(n-1)

    addi  a2,  s0,  -2      #compute fib(n-2)
    jal   fib               #jal ra, fib
    mv    s2,  a0            #s2 = fib(n-2)

    add   a0,  s1,  s2      #a0 = fib(n-1) + fib(n-2)
    b     fib_ret           #beq  x0, x0, fib_ret
fib_base:
    li    a0,  1

    ##Part 3. Epilogue as a callee
fib_ret:
    lw    ra,  12(sp)        #restore the return address
    lw    s0,  8(sp)        #restore $s0
    lw    s1,  4(sp)        #restore $s1
    lw    s2,  0(sp)        #restore $s2
    addi  sp,  sp,  16      #restore the stack pointer
    jr    ra                #jalr zero, ra, 0

main部分:

main:
    li    a7,  5    #load syscall read_int into a7
    ecall        #make the syscall
    mv    a2,  a0   #move the number read into a2
    jal   fib
    
    li    a7,  1    #load syscall print_int into $a7
    ecall        #make the syscall

    li    a7,  10   #progam exit system call
    ecall

.include "fib.s"
  • 写回答

3条回答 默认 最新

  • X-道至简 2023-04-02 22:09
    关注

    提供一个优化思路,看你是否可以用指令写出
    用一个中间缓存,示例代码如下:

    int buf[52] = {0};  //中间buf存放中间结果,避免重复计算
    int fib(n)
    {
        int tmp=0;
        if(buf[n] != 0 ) return buf[n];
        if(n==1 || n==2) return 1;
        tmp = fib(n-1)+fib(n-2);
        buf[n] = tmp;
        return tmp;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月3日
  • 已采纳回答 4月3日
  • 修改了问题 4月2日
  • 创建了问题 4月2日

悬赏问题

  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来