2014-10-03 6 views
0

소개 클래스 Java 클래스 (하위 집합 합계 문제)에 대한 프로그래밍 할당이 있습니다. - 어떤 이유로 인해 재귀 메서드가 제대로 실행되지 않습니다. 메서드의 끝으로 곧바로 이동합니다. 정렬 된 목록을 인쇄합니다). 어떤 도움을 주시면 감사하겠습니다. 저는 초보자이며 재귀 함수가 정말 혼란 스럽습니다.재귀 메서드가 제대로 실행되지 않습니다.

package programmingassignment3; 

import java.io.*; 
import java.util.*; 

public class ProgrammingAssignment3 { 

    static int TARGET = 10; 
    static ArrayList<Integer> list = new ArrayList<>(); 
    static int SIZE = list.size(); 

    public static void main(String[] args) { 
     populateSortSet(); 
     sumInt(list); 
     recursiveSS(list); 
    }//main 

    public static void populateSortSet() { 
     try { 
      File f = new File("set0.txt"); 
      Scanner input = new Scanner(f); 
      while (input.hasNext()) { 
       int ele = input.nextInt(); 
       if (ele < TARGET && !list.contains(ele)) { 
        list.add(ele); 
       }//if 
      }//while 
      Collections.sort(list); 
     }//try 
     catch (IOException e) { 
      e.printStackTrace(); 
     }//catch 
    }//populateSet 

    public static void recursiveSS(ArrayList<Integer> Alist) { 
     if (Alist.size() == SIZE) { 
      if (sumInt(Alist) == TARGET) { 
       System.out.println("The integers that equal " + TARGET + "are: " + Alist); 
      } //if==TARGET 
     }//if==SIZE 
     else { 
      for (int i = 0; i < SIZE; i++) { 
       ArrayList<Integer> list1 = new ArrayList<>(Alist); 
       ArrayList<Integer> list0 = new ArrayList<>(Alist); 
       list1.add(1); 
       list0.add(0); 
       if (sumInt(list0) < TARGET) { 
        recursiveSS(list0); 
       }//if 
       if (sumInt(list1) < TARGET) { 
        recursiveSS(list1); 
       }//if 
      }//for 
     }//else 
     System.out.println("echo" + Alist); 
    }//recursiveSS 

    public static int sumInt(ArrayList<Integer> Alist) { 
     int sum = 0; 
     for (int i = 0; i < SIZE - 1; i++) { 
      sum += Alist.get(i); 
     }//for 
     if (Alist.size() == TARGET) { 
      sum += Alist.get(Alist.size() - 1); 
     }//if 
     return sum; 
    }//sumInt 
}//class 
+0

이 모든 끔찍한 의견을 제거하십시오 : 나는 문제를 파악했고, (@duffymo의 독서 쾌락을 위해 제거 닫는 중괄호 코멘트)을 다음과 같이 솔루션입니다 "). 그들은 단지 혼란스럽고 가치를 더하지 않습니다. 재귀는 중지 조건을 식별하는 것으로 시작됩니다. 당신이하려는 일은 무엇입니까? 영어로 된 부분 합계 문제를 설명 할 수 있습니까? – duffymo

+0

@duffymo 닫는 중괄호 의견과 관련하여 옳고 그른 의견이 없습니다. 저자는 그녀가 입문 프로그래밍 수업에 있다고 말합니다. 이것이 중괄호가 어떻게 일치하는지 기억하는 데 도움이된다면 좋은 습관입니다. 내 중첩 된'# ifdef's가 혼란 스러울 때 C에서 때때로 사용합니다. –

+0

@WoodrowBarlow - 나는 거기에 있다고 생각한다. 그러한 혼란에 직업이 빠져들지 않습니다. 이것은 실제 IDE가있는 것입니다. 심지어 이클립스가 그것을 관리 할 수 ​​있습니다. 청력 가치가 있습니다. – duffymo

답변

0

다음은 어떻게 수행할까요? 나는 그것이 멈추는 조건과 재귀를 명확히하기를 희망한다. 나는 그것을 테스트하는 데 사용하는 경우 여기

import java.util.ArrayList; 
import java.util.List; 

/** 
* Demo of recursion 
* User: mduffy 
* Date: 10/3/2014 
* Time: 10:56 AM 
* @link http://stackoverflow.com/questions/26179574/recursive-method-not-properly-executing?noredirect=1#comment41047653_26179574 
*/ 
public class RecursionDemo { 

    public static void main(String[] args) { 
     List<Integer> values = new ArrayList<Integer>(); 
     for (String arg : args) { 
      values.add(Integer.valueOf(arg)); 
     } 
     System.out.println(String.format("input values : %s", values)); 
     System.out.println(String.format("iterative sum: %d", getSumUsingIteration(values))); 
     System.out.println(String.format("recursive sum: %d", getSumUsingRecursion(values))); 
    } 

    public static int getSumUsingIteration(List<Integer> values) { 
     int sum = 0; 
     if (values != null) { 
      for (int value : values) { 
       sum += value; 
      } 
     } 
     return sum; 
    } 

    public static int getSumUsingRecursion(List<Integer> values) { 
     if ((values == null) || (values.size() == 0)) { 
      return 0; 
     } else { 
      if (values.size() == 1) { // This is the stopping condition 
       return values.get(0); 
      } else { 
       return values.get(0) + getSumUsingRecursion(values.subList(1, values.size())); // Here is recursion 
      } 
     } 
    } 
} 

됩니다 :

input values : [1, 2, 3, 4, 5, 6] 
iterative sum: 21 
recursive sum: 21 

Process finished with exit code 0 
1

당신은 클래스 레벨에서 할이 일이 :

static ArrayList<Integer> list = new ArrayList<>(); 
static int SIZE = list.size(); 

는 크기가 0에 시작하고, 0를 유지된다는 것을 의미합니다

(당신이 목록에 요소를 추가 할 경우에도 마찬가지입니다.) 즉, for-loop 내부의 코드는 0 번 실행됩니다. 목록이 실제로 채워 때까지

public class ProgrammingAssignment3 { 
    private static int initialSize; 

    //... 
    public static void populateSortSet() { 
     //populate the list 
     initialSize = list.size(); 
    } 

그래서 당신이 크기 변수의 값을 설정하지 :

같은 것을보십시오.

코드에 다른 이상한 점이 많으므로 여기에서 해결하려는 내용을 정확하게 지정해야한다고 생각합니다.

+0

이 정적 키워드로 인해 발생 했습니까? –

+0

아니요, 비 정적 변수와 동일합니다. 'int'는 값을 기준으로 할당하지 않고, 할당시 목록 크기의 값을 갖습니다. – Tobb

+0

오, 나는 OP가 크기에 대한 변수를 만들었다는 사실조차 몰랐습니다. 나는 코드를 훑어 보았고'list.size()'가 항상 0이되어 혼란 스럽다는 것을 의미한다고 생각했다. –

0

감사합니다 모두 당신이 볼 수 있듯이, 정적 메서드는 문제가되지 않습니다. 도움에 정말 감사드립니다. "경우 //"와 "// 클래스 (예를 들어

public class ProgrammingAssignment3 { 

    static int TARGET = 6233; 
    static ArrayList<Integer> set = new ArrayList<>(); 
    static int SIZE; 
    static int count = 0; 

    public static void populateSortSet() { 
     try { 
      File f = new File("set3.txt"); 
      Scanner input = new Scanner(f); 
      while (input.hasNext()) { 
       int ele = input.nextInt(); 
       if (ele < TARGET && !set.contains(ele)) { 
        set.add(ele); 
       } 
      } 
      Collections.sort(set); 
      SIZE = set.size(); 
      System.out.println("The original sorted set: " + set + "\t subset sum = " + TARGET); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void recursiveSS(ArrayList<Integer> list) { 
     if (list.size() == SIZE) { 
      if (sumInt(list) == TARGET) { 
       System.out.print("The Bit subset is: " + list + "\t"); 
       System.out.println("The subset is: " + getSubset(list)); 
       count++; 
      } 
     } 
     else { 
      ArrayList<Integer> list1 = new ArrayList<>(list);//instantiate list1 
      ArrayList<Integer> list0 = new ArrayList<>(list);//instantiate list0 
      list1.add(1); 
      list0.add(0); 
      if (sumInt(list0) <= TARGET) { 
       recursiveSS(list0); 
      } 
      if (sumInt(list1) <= TARGET) { 
       recursiveSS(list1); 
      } 
     } 
    } 

    public static int sumInt(ArrayList<Integer> list) { 
     int sum = 0; 
     for (int i = 0; i < list.size(); i++) { 
      if (list.get(i) == 1) { 
       sum += set.get(i); 
      } 
     } 
     return sum; 
    } 

    public static ArrayList<Integer> getSubset(ArrayList<Integer> list) { 
     ArrayList<Integer> l = new ArrayList<>(); 
     for (int i = 0; i < list.size(); i++) { 
      if (list.get(i) == 1) { 
       l.add(set.get(i)); 
      } 
     } 
     return l; 
    } 
} 
관련 문제