递归-go:
不能想PHP一样使用全局变量
import (
"fmt"
"sort"
)
func combinationSum(candidates []int, target int) [][]int {
var data []int
var list [][]int
sort.Ints(candidates[:])
_,list = getOne(candidates, target, data, list)
// for i, candidate := range candidates {
//
// if candidate < target {
// data = append(data, candidate)
// newTarget := target - candidate
// combinationSum(candidates[i:], newTarget)
// data = append(data[:len(data)-1])
// } else if candidate == target {
//
// d := make([]int, len(data))
// copy(d, data)
// d = append(d, candidate)
//
// list = append(list, d)
//
// } else {
// break
// }
// }
return list
}
func getOne(candidates []int, target int, data []int, list [][]int) ([]int, [][]int) {
for i, candidate := range candidates {
if candidate < target {
data = append(data, candidate)
newTarget := target - candidate
data, list = getOne(candidates[i:], newTarget, data, list)
data = append(data[:len(data)-1])
} else if candidate == target {
d := make([]int, len(data))
copy(d, data)
d = append(d, candidate)
list = append(list, d)
} else {
break
}
}
return data, list
}
递归-php:
function combinationSum ($candidates, $target)
{
sort($candidates);
foreach ($candidates as $i => $candidate) {
// 值小于目标,则递归
if ($candidate < $target) {
$this->data[] = $candidate;
$newTarget = $target - $candidate;
// 每次传入子数组
$this->combinationSum(array_slice($candidates, $i), $newTarget);
// 递归完成后回到递归前的$data
array_pop($this->data);
} elseif ($candidate == $target) {
$this->data[] = $candidate;
$this->list[] = $this->data;
array_pop($this->data);
} else {
break;
}
}
return $this->list;
}