Golang——实现约瑟夫问题
package main
import (
"fmt"
"sync"
)
// 使用WaitGroup来同步所有goroutine
var wg sync.WaitGroup
// 定义一个结构体来表示约瑟夫环
type ring struct {
value int
next *ring
}
// 创建一个新的约瑟夫环
func newRing(n int) *ring {
if n < 1 {
return nil
}
circle := new(ring)
circle.value = 0
current := circle
for i := 1; i < n; i++ {
current.next = &ring{value: i}
current = current.next
}
current.next = circle
return circle
}
// 开始约瑟夫问题
func playJosephus(start int, count int, step int, wg *sync.WaitGroup) {
defer wg.Done() // 确保goroutine结束时减少计数
current := newRing(count)
for i := 0; i < start-1; i++ {
current = current.next
}
for {
for step-1 > 0 {
current = current.next
step--
}
fmt.Printf("%d出列\n", current.next.value)
current.next = current.next.next // 移除出列的节点
if current.next == current {
fmt.Printf("最后一个出列的是%d\n", current.value)
break
}
}
}
func main() {
// 假设有5个人,开始数数的位置是1,数到3时出列
wg.Add(1) // 增加一个goroutine
go playJosephus(1, 5, 3, &wg)
wg.Wait() // 等待所有goroutine结束
}
这段代码修复了原代码的逻辑错误,并且使用了sync.WaitGroup
来同步所有的goroutine,确保主程序在所有goroutine完成之前不会退出。
评论已关闭