這不是一個家庭作業,只是一個遞歸自我練習。 :)給定一個列表和一個限制,使用遞歸/回溯算法找到最大總和
給定一個整數表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