Go 语言递归函数
递归,就是在运行的过程中调用自己。
语法格式如下:
func recursion() {
recursion() /* 函数调用自身 */
}
func main() {
recursion()
}
recursion() /* 函数调用自身 */
}
func main() {
recursion()
}
Go 语言支持递归。但我们在使用递归时,开发者需要设置退出条件,否则递归将陷入无限循环中。
递归函数对于解决数学上的问题是非常有用的,就像计算阶乘,生成斐波那契数列等。
阶乘
以下实例通过 Go 语言的递归函数实例阶乘:
实例
package main
import "fmt"
func Factorial(n uint64)(result uint64) {
if (n > 0) {
result = n * Factorial(n-1)
return result
}
return 1
}
func main() {
var i int = 15
fmt.Printf("%d 的阶乘是 %d\n", i, Factorial(uint64(i)))
}
import "fmt"
func Factorial(n uint64)(result uint64) {
if (n > 0) {
result = n * Factorial(n-1)
return result
}
return 1
}
func main() {
var i int = 15
fmt.Printf("%d 的阶乘是 %d\n", i, Factorial(uint64(i)))
}
以上实例执行输出结果为:
15 的阶乘是 1307674368000
斐波那契数列
以下实例通过 Go 语言的递归函数实现斐波那契数列:
实例
package main
import "fmt"
func fibonacci(n int) int {
if n < 2 {
return n
}
return fibonacci(n-2) + fibonacci(n-1)
}
func main() {
var i int
for i = 0; i < 10; i++ {
fmt.Printf("%d\t", fibonacci(i))
}
}
import "fmt"
func fibonacci(n int) int {
if n < 2 {
return n
}
return fibonacci(n-2) + fibonacci(n-1)
}
func main() {
var i int
for i = 0; i < 10; i++ {
fmt.Printf("%d\t", fibonacci(i))
}
}
以上实例执行输出结果为:
0 1 1 2 3 5 8 13 21 34
求平方根
以下实例通过 Go 语言使用递归方法实现求平方根的代码:
实例
package main
import (
"fmt"
)
func sqrtRecursive(x, guess, prevGuess, epsilon float64) float64 {
if diff := guess*guess - x; diff < epsilon && -diff < epsilon {
return guess
}
newGuess := (guess + x/guess) / 2
if newGuess == prevGuess {
return guess
}
return sqrtRecursive(x, newGuess, guess, epsilon)
}
func sqrt(x float64) float64 {
return sqrtRecursive(x, 1.0, 0.0, 1e-9)
}
func main() {
x := 25.0
result := sqrt(x)
fmt.Printf("%.2f 的平方根为 %.6f\n", x, result)
}
import (
"fmt"
)
func sqrtRecursive(x, guess, prevGuess, epsilon float64) float64 {
if diff := guess*guess - x; diff < epsilon && -diff < epsilon {
return guess
}
newGuess := (guess + x/guess) / 2
if newGuess == prevGuess {
return guess
}
return sqrtRecursive(x, newGuess, guess, epsilon)
}
func sqrt(x float64) float64 {
return sqrtRecursive(x, 1.0, 0.0, 1e-9)
}
func main() {
x := 25.0
result := sqrt(x)
fmt.Printf("%.2f 的平方根为 %.6f\n", x, result)
}
以上实例中,sqrtRecursive 函数使用递归方式实现平方根的计算。
sqrtRecursive 函数接受四个参数:
- x 表示待求平方根的数
- guess 表示当前猜测的平方根值
- prevGuess 表示上一次的猜测值
- epsilon 表示精度要求(即接近平方根的程度)
递归的终止条件是当前猜测的平方根与上一次猜测的平方根非常接近,差值小于给定的精度 epsilon。
在 sqrt 函数中,我们调用 sqrtRecursive 来计算平方根,并传入初始值和精度要求,然后在 main 函数中,我们调用 sqrt 函数来求解平方根,并将结果打印出来。
执行以上代码输出结果为:
25.00 的平方根为 5.000000
会飞的菊花怪
192***6758@qq.com
斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。
在这里的:
是指的 n-2 是 n 前面第二项的值,而不是 n-2=x 的值,那么 n-1 也与此同理。
会飞的菊花怪
192***6758@qq.com
slepox
sle***@163.com
更好的一种 fibonacci 实现,用到多返回值特性,降低复杂度:
func fibonacci2(n int) (int,int) { if n < 2 { return 0,n } a,b := fibonacci2(n-1) return b,a+b } func fibonacci(n int) int { a,b := fibonacci2(n) return b }slepox
sle***@163.com
千年
dai***8622@126.com
求平方根
原理: 计算机通常使用循环来计算 x 的平方根。从某个猜测的值 z 开始,我们可以根据 z² 与 x 的近似度来调整 z,产生一个更好的猜测:
重复调整的过程,猜测的结果会越来越精确,得到的答案也会尽可能接近实际的平方根。
package main import "fmt" func sqrt(x float64,i float64) (float64,float64){ remain:=(i*i-x)/(2*i); i=i-remain if(remain>0){ return sqrt(x,i); }else{ return i,remain } } func get_sqrt(x float64) float64{ i,_ :=sqrt(x,x); return i; } func main(){ fmt.Println(get_sqrt(2)) fmt.Println(get_sqrt(3)) }千年
dai***8622@126.com
Sunday
381***589@qq.com
求平方根算法复杂度改成 O(1):
package main import "fmt" import "unsafe" func get_sqrt(x float32) float32{ xhalf := 0.5*x; var i int32 = *(*int32)(unsafe.Pointer(&x)); i = 0x5f375a86 - (i>>1); x = *(*float32)(unsafe.Pointer(&i)); x = x * (1.5 - xhalf*x*x); x = x * (1.5 - xhalf*x*x); x = x * (1.5 - xhalf*x*x); return 1/x; } func main(){ fmt.Println(get_sqrt(4)) }Sunday
381***589@qq.com