이것은 숙제가 아니며 재귀에 대한 자기 연습입니다. :)목록과 한도가 주어지면 회귀/역 추적 알고리즘을 사용하십시오. 최대 값 찾기
한계 N을 초과하지 않는 정수리스트 L과 한계 N의 maxSum (L, N)를 찾을 수 감안할 때. L = [7, 30, 8, 22, 6, 1, 14] 및 한계 n = 19이면 maxSum (L, n) = 16입니다. 최대 조합은 7 + 8 + 1 = 16이기 때문입니다. 이 문제는 프로그램의 모든 루프를 허용하지 않기 때문에, 그러나
public static int maxSum(List<Integer> L, int limit){
boolean[] used = new boolean[L.size()];
int[] max = {0};
rec(L, limit, 0, used, max);
return max[0];
}
public static boolean rec(List<Integer> L, int limit, int cur, boolean[] used, int[] max){
if(cur > limit){
return false;
}
for(int i=0; i<L.size(); i++){
if(!used[i]){
used[i] = true;
if(rec(L, limit, cur+L.get(i), used, max)){
max[0] = Math.max(max[0], cur+L.get(i));
}
used[i] = false;
}
}
return true;
}
:
나는이 문제를 해결하기 위해 고전 역 추적 알고리즘을 알아 냈어요. 그래서 내 rec() 함수에서 for 루프를 제거하는 방법이 있는지 궁금하네요. 대단히 감사합니다!
순환을 재귀 함수로 재 작성하는 방법은 항상 있습니다. 특히 일부 언어에는 루프가없고 순환 (예 : Scheme, Prolog) 만 있습니다. [읽을 물건] (http://www.refactoring.com/catalog/replaceIterationWithRecursion.html) – Amadan