go 给定范围内任意数字组合相加寻找目标值

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package main
 
import (
    "fmt"
    "sort"
)
 
var num_list []int = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
 
var des int = 0
 
func main() {
 
    sort.Ints(num_list) //从小到大排序一下
    fmt.Println(num_list)
 
    find(16, num_list, ``)
 
}
 
func find(sum int, intlist []int, s string) {
 
    //递归出口:切片长度位0,剩余数相加小于目标数,目标数小于等于0,最小数大于目标数
    count := len(intlist)
    intsums := intlist_sum(intlist)
 
    if count == 0 || intsums < sum || sum <= 0 || intlist[0] > sum {
 
        return
    }
 
    temp_list := del_item(count, intlist)
 
    //不取当前切片的最后一个值,直接进入下一轮递归
    find(sum, temp_list, s)
 
    //取当前切片的最后一个值,并进入递归
 
    temp_int := intlist[count-1] //当前最大值
    if temp_int > sum {
 
        return
    }
    if temp_int < sum {
 
        if intlist_sum(temp_list) >= (sum - temp_int) {
 
            s = s + fmt.Sprintf("%d-%d==>", sum, temp_int)
            find(sum-temp_int, temp_list, s)
 
        } else {
            return
        }
 
    }
    if temp_int == sum {
        des++
        fmt.Println(des, "种可能:", s, "找到了", temp_int)
 
        return
    }
 
}
 
//删除切片的第i个元素,i从0开始, 返回新的切片
func del_item(i int, arr []int) []int {
 
    count := len(arr)
    //切片为空则直接返回
    if count == 0 {
        return arr
    }
 
    //i小于0就删第0个元素
    if 1 < 0 {
        i = 0
    }
 
    //传的i超出切片界限就删最后一个元素
    if i > count-1 {
        i = count - 1
        //  return arr[:count-1]
    }
    //  fmt.Println("删除第", i, "位的元素(首位是第0位)")
    return append(arr[:i], arr[i+1:]...)
 
}
 
//整形切片求和
func intlist_sum(i []int) int {
    j := 0
    for _, m := range i {
        j += m
    }
    return j
}

  

 

结果:

[1 2 3 4 5 6 7 8 9 10 11]
1 种可能: 16-6==>10-4==>6-3==>3-2==> 找到了 1
2 种可能: 16-6==>10-5==>5-3==> 找到了 2
3 种可能: 16-6==>10-5==>5-4==> 找到了 1
4 种可能: 16-7==>9-4==>5-3==> 找到了 2
5 种可能: 16-7==>9-5==>4-3==> 找到了 1
6 种可能: 16-7==>9-5==> 找到了 4
7 种可能: 16-7==>9-6==>3-2==> 找到了 1
8 种可能: 16-7==>9-6==> 找到了 3
9 种可能: 16-8==>8-4==>4-3==> 找到了 1
10 种可能: 16-8==>8-5==>3-2==> 找到了 1
11 种可能: 16-8==>8-5==> 找到了 3
12 种可能: 16-8==>8-6==> 找到了 2
13 种可能: 16-8==>8-7==> 找到了 1
14 种可能: 16-9==>7-4==>3-2==> 找到了 1
15 种可能: 16-9==>7-4==> 找到了 3
16 种可能: 16-9==>7-5==> 找到了 2
17 种可能: 16-9==>7-6==> 找到了 1
18 种可能: 16-9==> 找到了 7
19 种可能: 16-10==>6-3==>3-2==> 找到了 1
20 种可能: 16-10==>6-4==> 找到了 2
21 种可能: 16-10==>6-5==> 找到了 1
22 种可能: 16-10==> 找到了 6
23 种可能: 16-11==>5-3==> 找到了 2
24 种可能: 16-11==>5-4==> 找到了 1
25 种可能: 16-11==> 找到了 5

 

posted @   wsh3166Sir  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示