【问题标题】:What is a good iterative solution for this recursive algorithm?这个递归算法的一个好的迭代解决方案是什么?
【发布时间】:2014-06-28 14:31:36
【问题描述】:

问题:给定一个数组和一个目标数,打印出方法数目标数可以写成数组中元素的唯一组合。 p>

示例

array = {1,2,3} target = 4
4 = {2,2}, {3,1}, {1,1,1,1} //numbers can be repeatedly selected from the array.
Ans: 3 ways

递归解决方案

F(4) = F(4-1) + F(4-2) + F(4-3)
F(4) = F(3) + F(2) + F(1)
...

总和是每次递归调用函数的总和,减去数组值作为参数。

从概念上讲,递归可以表示为(具有讽刺意味的是一次迭代):

for(int i=0; i<array.length; i++)
   sum+=F(target - array[i]);

基本案例:

F(0) = 1 //Implies sums to target
F(<0) = 0 //Implies cannot sum to target

然而,即使是上述的一个小例子,它也会导致 StackOverflowError。如何最好地迭代以下解决方案:

代码

public class CombinationSum {

    private int[] array;
    private int target;

    public CombinationSum(int[] array, int target)
    {
        this.array = array;
        this.target = target;
    }

    public int recurSum(int val)
    {
        int sum = 0;

        if(val < 0 )
            return 0;
        else if(val == 0)
            return 1;
        else 
        {
            for(int i = 0; i<array.length; i++)
            {
                sum+= recurSum(target-array[i]); //heavy recursion here?

            }

            return sum;
        }
    }

    public static void main(String[] args)
    {
        int target = 4;
        int[] array = {1,2,3};

        CombinationSum cs = new CombinationSum(array, target);

        System.out.println("Number of possible combinations: "+cs.recurSum(target));
    }

}

【问题讨论】:

标签: java algorithm recursion iteration


【解决方案1】:

伪代码

F[0]=1;

for(i=1;i<=n;++i){
  F[i]=0;
  for(j=1;j<i++j){
    F[i]+=F[i-j];
  }

}

print F[n];

【讨论】:

    【解决方案2】:

    这是 Python 中的解决方案。

    #input is a list A of positive integers, and a target integer n
    #output is a list of sublists of A (repeats OK!) with sum n
    #permutations will appear
    def make_list(A,n):
        A = list(set(A)) #eliminate repeats in A
        L = []
        if n > 0:
            for a in A:
                if type(make_list(A,n-a)) == list:
                    for l in make_list(A,n-a):
                        l.append(a)
                        L.append(l)
        elif n == 0:
            L = [[]]
        else: L = -1
        return L
    
    #returns the count of distinct lists in make_list(A,n)
    def counter(A,n):
        b = []
        for l in make_list(A,n):    
            if sorted(l) not in b:
                b.append(sorted(l))
        return len(b)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-22
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2021-07-04
      • 2020-06-07
      • 1970-01-01
      相关资源
      最近更新 更多