1. 程式人生 > 其它 >go 給定範圍內任意數字組合相加尋找目標值

go 給定範圍內任意數字組合相加尋找目標值

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