惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
博客园_首页
美团技术团队
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
J
Java Code Geeks
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
G
Google Developers Blog
爱范儿
爱范儿
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
宝玉的分享
宝玉的分享
小众软件
小众软件
MongoDB | Blog
MongoDB | Blog
博客园 - 三生石上(FineUI控件)
L
LangChain Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Visual Studio Blog
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - dribs

PD分离 基于GPT2训练构建医疗问诊机器人 物流行业信息咨询智能问答系统 day8 golang-chan-协程-定时器-锁-等待组 day7 golang GMP golang面试题单向链表和双向链表 golang 自行实现一个base64加密 golang标准库log+第三方zerolog golang标准库序列化反序列化 json + 第三方msgpack golang 标准库 目录操作 golang-day1 进制 golang-标准库文件操作 golang-标准库时间time day6 golang-标准库(随时更新) golang--day5结构体+结构体排序+错误处理+结构体和接口实现面向对象的例子 ceph warn oldest client/flush tid ceph 扩容后healt-error k8s系列---pod手动驱逐 k8s系列---Chart(下)
golang-day4函数
dribs · 2023-01-29 · via 博客园 - dribs

2023-01-29 21:58  dribs  阅读(47)  评论()    收藏  举报

斐波那契数列三种实现方式

1、循环实现

func fib1(n int) int {
	//完整逻辑
	switch {
	case n < 0:
		panic("n is negative")
	case n == 0:
		return 0
	case n == 1 || n == 2:
		return 1
	}
	a, b := 1, 1
	for i := 0; i < n-2; i++ {
		a, b = b, a+b
	}
	return b
}

2、美丽的公式 递推公式完成

func fib2(n int) int {
	if n == 2 || n == 1 {
		return 1
	}
	return fib2(n-1) + fib2(n-2)
}

3、循环改调用

func fib3(n, a, b int) int {
	if n < 3 {
		return b
	}
	return fib3(n-1, b, a+b)
}
package main

import (
	"fmt"
)

//美丽公式
func fac1(n int) int {
	//fac(n)= n * (n-1)!
	if n == 0 || n == 1 {
		return 1
	}
	return n * fac1(n-1)
}

//循环
func fac2(n int) int {
	//fac2(n) = 1 * 2 *3 *...*n
	//fac2(3)= 1 * 2 * 3
	if n == 0 || n == 1 {
		return 1
	}
	a := 1
	for i := 1; i < n+1; i++ {
		a *= i
	}
	return a
}

//循环改调用
func fac3(n, a int) int {
	if n < 2 {
		return a
	}
	return fac3(n-1, a*n) //4 ,3 1*4=4; 3, 2 4*3=12; 2, 1 12*2=24
}

//倒三角循环实现
func n1(n int) {
	//2 1
	//  1
	a := n
	b := 0
	for i := 1; i <= n; n-- {
		if n < 9 {
			b++
			fmt.Printf("%[1]*s", 3*(a-n)-b, "")
		}
		if n > 8 && n < a {
			fmt.Printf("%[1]*s", 3*(a-n), "")
		}
		for j := n; j >= i; j-- {
			fmt.Printf("%d ", j)
		}

		println()
	}
}

//正三角循环实现
func n2(n int) {
	//  1
	//2 1
	b := 9
	for i := 1; i <= n; i++ {
		if i > 8 {
			fmt.Printf("%[1]*s", 3*(n-i), "")
		}
		if i < 9 {
			b--
			fmt.Printf("%[1]*s", 3*(n-i)-b, "")
		}
		for j := i; j >= 1; j-- {
			fmt.Printf("%d ", j)
		}
		println()
	}
}

func main() {
	//阶乘三种实现
	println(fac1(4))
	println(fac2(4))
	println(fac3(4, 1))

	//倒三角
	n1(12)
	//正三角
	n2(12)
}