Algorithm 如何打印大小为m、给定数字为n的所有子序列?

Algorithm 如何打印大小为m、给定数字为n的所有子序列?,algorithm,go,recursion,data-structures,divide-and-conquer,Algorithm,Go,Recursion,Data Structures,Divide And Conquer,对于以下问题: 数字的子序列是该数字的一系列(不一定是连续的)数字。例如,12345的子序列包括123、234、124、245等。您的任务是生成低于特定长度的子序列 以下是非工作解决方案: package main import ( "fmt" "strconv" ) func generateSubSequence(n int, subSequenceSize int) []int { digitSequence := i

对于以下问题:

数字的子序列是该数字的一系列(不一定是连续的)数字。例如,12345的子序列包括123、234、124、245等。您的任务是生成低于特定长度的子序列


以下是非工作解决方案:

package main

import (
    "fmt"
    "strconv"
)

func generateSubSequence(n int, subSequenceSize int) []int {

    digitSequence := intToSequenceOfDigits(n) // [2,0,1,2,5]

    var f func([]int, int, int) []int
    f = func(digitSequence []int, pickingIndex int, currentSubSequenceSize int) []int {

        if pickingIndex+1 == currentSubSequenceSize {
            value := sequenceOfDigitsToInt(digitSequence[0:currentSubSequenceSize])
            return []int{value}
        }

        if currentSubSequenceSize == 0 {
            return []int{}
        }

        digit := digitSequence[pickingIndex]

        withM := mapDigit(f(digitSequence, pickingIndex-1, currentSubSequenceSize-1), digit)
        withoutM := f(digitSequence, pickingIndex-1, currentSubSequenceSize)

        return append(withM, withoutM...)
    }

    return f(digitSequence, len(digitSequence)-1, subSequenceSize)
}

func mapDigit(slice []int, digit int) []int {
    result := make([]int, len(slice))
    for i, value := range slice {
        result[i] = value*10 + digit
    }
    return result
}

func sequenceOfDigitsToInt(digits []int) int {
    result := 0
    for _, value := range digits {
        result = result*10 + value
    }
    return result
}

func intToSequenceOfDigits(n int) []int { // [2,0,1,2,5]
    var convert func(int) []int
    sequence := []int{}
    convert = func(n int) []int {
        if n != 0 {
            digit := n % 10
            sequence = append([]int{digit}, sequence...)
            convert(n / 10)
        }
        return sequence
    }
    return convert(n)
}


func main() {
    fmt.Println(generateSubSequence(20125, 3))
}

实际输出为:
[225 215 205 212 202 201]

预期输出为:
[201 202 205 212 215 225 012 015 025 125]


为什么实际输出缺少一些子序列?像
125
等等..

像这样的吗?修改我的其他文件:

函数f(s,i,l){
如果(i+1==l)
返回[s.substr(0,l)];
如果(!l)
返回[''];
常数左=f(s,i-1,l);
常数右=f(s,i-1,l-1);
返回左侧。concat(
右.map(x=>x+s[i]);
}
变量输入=[
['20125', 3],
['12345', 3]
];
for(让[s,l]为输入){
console.log(s+',l:'+l);
log(JSON.stringify(f(s,s.length-1,l));
控制台日志(“”);

}
提示:通过选择第一个数字,然后从其右边的数字中选择长度为m-1的子序列,可以得到长度为m的子序列。您也可以使用二进制表示中的数字集来获得子序列。问题未明确说明。第一个示例显示所有长度的组合,但第二个示例仅显示长度为3的组合。还有一个例子说“最大值是225,所以我们的答案是225”,而问题并没有提到最大值。@MBo查询用适当的细节编辑,但输出不匹配。。。对于(20125,3),我们还应该看到输出
012
025
125
。与(12345,3)相同,我们应该看到输出
235
234
等。@overexchange错过了那个。现在怎么样?@overexchange对不起,我不懂语言,走吧。也许你们可以在Stackoverflow上发布一个问题,包括你们的代码并寻求帮助?我在现有的问题中加入了GO标签
package main

import (
    "fmt"
    "strconv"
)

func generateSubSequence(n int, subSequenceSize int) []int {

    digitSequence := intToSequenceOfDigits(n) // [2,0,1,2,5]

    var f func([]int, int, int) []int
    f = func(digitSequence []int, pickingIndex int, currentSubSequenceSize int) []int {

        if pickingIndex+1 == currentSubSequenceSize {
            value := sequenceOfDigitsToInt(digitSequence[0:currentSubSequenceSize])
            return []int{value}
        }

        if currentSubSequenceSize == 0 {
            return []int{}
        }

        digit := digitSequence[pickingIndex]

        withM := mapDigit(f(digitSequence, pickingIndex-1, currentSubSequenceSize-1), digit)
        withoutM := f(digitSequence, pickingIndex-1, currentSubSequenceSize)

        return append(withM, withoutM...)
    }

    return f(digitSequence, len(digitSequence)-1, subSequenceSize)
}

func mapDigit(slice []int, digit int) []int {
    result := make([]int, len(slice))
    for i, value := range slice {
        result[i] = value*10 + digit
    }
    return result
}

func sequenceOfDigitsToInt(digits []int) int {
    result := 0
    for _, value := range digits {
        result = result*10 + value
    }
    return result
}

func intToSequenceOfDigits(n int) []int { // [2,0,1,2,5]
    var convert func(int) []int
    sequence := []int{}
    convert = func(n int) []int {
        if n != 0 {
            digit := n % 10
            sequence = append([]int{digit}, sequence...)
            convert(n / 10)
        }
        return sequence
    }
    return convert(n)
}


func main() {
    fmt.Println(generateSubSequence(20125, 3))
}