思路:我们有n张牌,不妨先假设有一个洗牌函数shuffle(....),能完美的洗出n-1张牌 。拿第n张牌来打乱前面n-1的洗牌顺序,从而得到n张牌的最终结果。
举例说明:如果1,2,3三张牌,想完美洗牌,那么先让1,2洗牌洗好,再把3与其中之一(随机选取)进行交换,所以是递归思想,而非循环思想,差别是递归是等洗出n-1张牌再拿第n张牌去交换,如果要循环做,就是第n张牌去换一下n-1张牌其中之一
递归代码:
package mainimport ( "fmt" "math/rand" "time")func randNum(low, high int) int { r := rand.New(rand.NewSource(time.Now().UnixNano())) return low + r.Intn(high-low+1)}func shuffle(arr []int, n int) { if n <= 0 { return } shuffle(arr, n-1) rand := randNum(0, n) arr[n], arr[rand] = arr[rand], arr[n]}func main() { cards := []int{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52} cardslen := len(cards) cardslen1 := cardslen / 4 for i := 1; i <= 10; i++ { fmt.Printf("\n") shuffle(cards, cardslen-1) for j := 1; j <= cardslen; j++ { fmt.Printf("%d ", cards[j-1]) if j%cardslen1 == 0 { fmt.Printf("\n") } } }}