首页 > 解决方案 > 使用闭包在 Go 中编写下一个排列,我的代码有什么问题

问题描述

我编写了一个使用闭包的函数“iterPermutation”。我想从我做不到的闭包中返回数组和布尔值。所以只尝试了数组但它仍然给出了一个错误

不能在返回参数中使用 func 文字(类型 func() []int)作为类型 []int

我想像使用 iterPermutation

a := []int{0,1,2,3,4}
nextPermutation, exists := iterPermutation(a)
for exists {
    nextPermutation()
}

func iterPermutation(a []int) []int {
    return func() []int {
        i := len(a) - 2

        for i >= 0 && a[i+1] <= a[i] {
            i--
        }
        if i < 0 {
            return a
        }

        j := len(a) - 1
        for j >= 0 && a[j] <= a[i] {
            j--
        }

        a[i], a[j] = a[j], a[i]

        for k, l := i, len(a)-1; k < l; k, l = k+1, l-1 {
            a[k], a[l] = a[l], a[k]
        }
        return a
    }
}

标签: go

解决方案


返回语句的 Golang 规范描述:

返回值或值可以显式地列在“return”语句中。每个表达式必须是单值的,并且可以分配给函数结果类型的相应元素。

调用置换的函数应该包含两个值作为返回值,一个用于数组,另一个用于布尔值。由于您从函数返回中分配了两个变量:

a := []int{0,1,2,3,4}
nextPermutation, exists := iterPermutation(a) // it should return two values one for nextPermutation which is an array and other is exists which might be a boolean value.
for exists {
    nextPermutation()
}

对于以下错误:

“不能在返回参数中使用 func 文字(类型 func() []int)作为类型 []int”

您将返回包含在置换闭包函数中的 func() 文字以及布尔值,因此将返回类型更改为:

package main

func main(){
    a := []int{0,1,2,3,4}
    nextPermutation, _ := iterPermutation(a)
        nextPermutation()
}

func iterPermutation(a []int) ((func() []int), bool) { // return both values
    return func() []int {
        i := len(a) - 2

        for i >= 0 && a[i+1] <= a[i] {
            i--
        }
        if i < 0 {
            return a
        }

        j := len(a) - 1
        for j >= 0 && a[j] <= a[i] {
            j--
        }

        a[i], a[j] = a[j], a[i]

        for k, l := i, len(a)-1; k < l; k, l = k+1, l-1 {
            a[k], a[l] = a[l], a[k]
        }
        return a
    }, true // add boolean value to return from the function.
}

操场上的工作答案


推荐阅读