源码下载:https://github.com/zhangdapeng520/zdpgo_algorithm/tree/main/examples/09recursive/go_examples
1、求阶乘package main
import "fmt"
// 求n的阶乘
func factorial(n int)int{
if n<=1{
return n
}else{
return n * factorial(n-1)
}
}
func main() {
fmt.Println(factorial(1))
fmt.Println(factorial(2))
fmt.Println(factorial(3))
fmt.Println(factorial(4))
fmt.Println(factorial(5))
}
2、二分查找
package main
import "fmt"
// 二分查找
func binarySearch(arr []int, target, low, high int)int{
if low > high{
return -1
}else {
mid := (low + high) / 2
if target == arr[mid]{
return mid
}else if target < arr[mid]{
return binarySearch(arr, target, low, mid - 1)
}else{
return binarySearch(arr, target, mid + 1, high)
}
}
}
func main(){
arr := []int{1,2,3,4,5,6}
i := binarySearch(arr, 3, 0, len(arr))
if i == -1 {
print("要查找的元素不存在")
return
}
fmt.Println(i, arr[i])
}
3、文件夹磁盘占用量
package main
import (
"fmt"
"os"
"path/filepath"
)
// 判断文件是否存在
func exists(path string) bool {
_, err := os.Stat(path)
return err == nil || os.IsExist(err)
}
// 获取文件大小
func getFileSize(path string) int64 {
if !exists(path) {
return 0
}
fileInfo, err := os.Stat(path)
if err != nil {
return 0
}
return fileInfo.Size()
}
// 文件夹占用磁盘大小
func diskUsage(path string) (int64, error) {
var size int64
err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
size += info.Size()
}
return err
})
return size, err
}
func main(){
fmt.Println(diskUsage("D:\BaiduNetdiskWorkspace\文档"))
}
4、斐波那契数列
package main
import "fmt"
// 求斐波那契数列第n位
func fibonacci(n int) (int, int) {
if n<=1{
return n, 0
}else{
a, b := fibonacci(n - 1)
return a + b, a
}
}
func main() {
fmt.Println(fibonacci(1))
fmt.Println(fibonacci(2))
fmt.Println(fibonacci(3))
fmt.Println(fibonacci(4))
fmt.Println(fibonacci(5))
fmt.Println(fibonacci(6))
fmt.Println(fibonacci(7))
fmt.Println(fibonacci(8))
fmt.Println(fibonacci(9))
}
5、求和
package main
import "fmt"
// 求切片的前n个数的和
func linearSum(arr []int, n int) int {
if n == 0{
return 0
}else{
return linearSum(arr, n-1) + arr[n-1]
}
}
func main() {
arr := []int{1,2,3,4,5,55,5,666,6,66,66}
fmt.Println(linearSum(arr, 0))
fmt.Println(linearSum(arr, 1))
fmt.Println(linearSum(arr, 2))
fmt.Println(linearSum(arr, 3))
fmt.Println(linearSum(arr, 4))
}
6、列表元素反转
package main
import "fmt"
// 翻转切片
func reverse(arr []int, start, stop int) {
if start < stop -1 {
arr[start], arr[stop-1] = arr[stop-1], arr[start]
reverse(arr, start+1, stop-1)
}
}
func main() {
arr := []int{1, 2, 3, 4, 5}
fmt.Println(arr)
reverse(arr, 0, len(arr))
fmt.Println(arr)
}
7、求幂
package main
import "fmt"
// 求x的n次方
func power(x, n int) int {
if n==0{
return 1
}else{
mid := power(x, n/2) // 乘一半
result := mid * mid // 幂一定是 一半 * 一半
if n%2==1{ // 如果是奇数个,还需要再乘一次x
result *= x
}
return result
}
}
func main() {
fmt.Println(power(2,1))
fmt.Println(power(2,2))
fmt.Println(power(2,3))
fmt.Println(power(2,4))
fmt.Println(power(2,5))
}



