• 斐波那契数列实现


    注意事项:

    1. 百科给出的解释是F(1)=1, F(2)=1,不是F(1)=0, F(2)=1
    2. 最好定义为int64类型,避免数据过大而异常
    3. 为了精确显示测试时间,统一用纳秒,转换单位前注意转换为float64类型,否则可能只显示0
    • 函数
    package main
    import (
            "fmt"
            "time"
    )
    // 方法一:递归
    func Fibonacci1(n int64) int64 {
            if n == 0 || n == 1 {
                    return n
            } else if n > 1{
                    return Fibonacci1(n-2) + Fibonacci1(n-1)
            } else {
                    fmt.Println("输入错误,请重新输入!")
                    return 0
            }
    }
    // 方法二:利用中间值传递循环,效率更高
    func Fibonacci2(n int64) int64 {
            if n == 0 || n == 1 {
                    return n
            } else if n > 1 {
                    var first int64 = 0
                    var second int64 = 1
                    var i int64
                    var sum int64
                    for i = 1; i <= n-1; i++ {
                            sum = first + second
                            first = second
                            second = sum
                    }
                    return second
            } else {
                    fmt.Println("输入错误,请重新输入!")
                    return 0
            }
    }
    
    func main() {
            var n int64
    
            fmt.Println("请输入序列号n: ")
            fmt.Scanln(&n)
    		
        	//测试时间
            beginTime1 := time.Now().UnixNano()
            fmt.Println("result1=",Fibonacci1(n))
            endTime1 := time.Now().UnixNano()
            costTime1 := endTime1 - beginTime1
            fmt.Printf("测试函数1花费时间costTime1=%v秒
    ",float64(costTime1)/1000000000)
    
            beginTime2 := time.Now().UnixNano()
            fmt.Println("result2=",Fibonacci2(n))
            endTime2 := time.Now().UnixNano()
            costTime2 := endTime2 - beginTime2
            fmt.Printf("测试函数2花费时间costTime2=%v秒",float64(costTime2)/1000000000)
    
            fmt.Println()
    }
    
    • 切片
    package main
    import (
            "fmt"
    )
    func Fibonacci(n int64) (fibonacci []uint64) {
            fibonacci = make([]uint64, n)
            // 这里下标减一是因为切片,而不是因为数列第0项,即fibonacci[0]还是f(1)
            fibonacci[0] = 1
            fibonacci[1] = 1
            var i int64
            var first uint64 = 1
            var second uint64 = 1
            for i = 2; i < n; i++ {
                    fibonacci[i] = first + second
                    first = second
                    second = fibonacci[i]
            }
            return fibonacci
    }
    func main() {
            var n int64
            fmt.Println("请输入数列长度:")
            fmt.Scanln(&n)
            fibonacci := Fibonacci(n)
            // 打印切片
            fmt.Println("fibonacci=",fibonacci)
            fmt.Println()
            // 打印数列,访问数组仍要从0开始,输出下标可以加1
            for i := 0; i < len(fibonacci); i++ {
                    fmt.Printf("f(%d)=%v
    ",i+1,fibonacci[i])
            }
    }
    
  • 相关阅读:
    kubestack 源码分析
    CNI IPAM插件分析 --- 以hostlocal为示例
    CNI bridge 插件实现代码分析
    CNI插件实现框架---以loopback为示例
    CNI Proposal 摘要
    OpenStack Network --- introduction部分 阅读笔记
    javascript变量,类型 第9节
    html页面布局 第8节
    css样式继承 第7节
    css样式 第6节
  • 原文地址:https://www.cnblogs.com/levin-ling/p/13405598.html
Copyright © 2020-2023  润新知