斐波拉契序列的 Go 实现


本篇文章主要介绍斐波拉契序列的 Go 语言实现。

斐波拉契序列: 前面相邻两项之后构成后一项。

1. 循环迭代

package main

import "fmt"

const maxSize = 20

func fibonacci(fs *[maxSize]int) {
	fs[0] = 0
	fs[1] = 1
	for index := 2; index < maxSize; index++ {
		fs[index] = fs[index-1] + fs[index-2]
	}
}

func main() {
	var fibSequence [maxSize]int

	fibonacci(&fibSequence)
	fmt.Printf("fibonacci sequence: %v\n", fibSequence)	
}

执行结果:

fibonacci sequence: [0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181]

2. 递归调用

package main

import "fmt"

const maxSize = 20

func fibonacci_rec(n int) int {
	// Go 不支持三元表达式: https://golang.org/doc/faq#Does_Go_have_a_ternary_form 
	if n < 2 {
		if n == 0 {
			return n
		} else {
			return n
		}
	}

	return fibonacci_rec(n-1) + fibonacci_rec(n-2)
}

func main() {
	var fibSequence [maxSize]int

	for index := 0; index < maxSize; index++ {
		fibSequence[index] = fibonacci_rec(index)
	}
	fmt.Printf("fibonacci sequence: %v\n", fibSequence)
}

代码介绍:

  • 递归函数: 直接调用自己或者间接调用自己的函数,递归要有退出条件防止陷入无限递归中。
  • 递归符合栈的数据结构。在前行阶段对每一层递归,函数的局部变量,参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量,参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复了调用状态。
posted @ 2021-04-18 18:44  lubanseven  阅读(86)  评论(0编辑  收藏  举报