題目: 寫出C++程式碼說明傳值呼叫call by value。
答案: 111. 傳入陣列A和整數S，寫出C++函數從A找三個數字加總為S的組合。  //本程式收到一個整數陣列 A 和一個整數 S，然後找出陣列 A 中的三個數，使它們的和等於 S  #include <iostream> #include <vector> #include <algorithm>  using namespace std;  vector<vector<int>> findCombination(vector<int>& A, int S) {     vector<vector<int>> result;     int n = A.size();          sort(A.begin(), A.end());  // 排序陣列 A，以便在後續查找中使用雙指針法          for (int i = 0; i < n - 2; i++) {         if (i > 0 && A[i] == A[i - 1])             continue;  // 避免重複的組合                  int left = i + 1;         int right = n - 1;                  while (left < right) {             int sum = A[i] + A[left] + A[right];                          if (sum == S) {                 result.push_back({A[i], A[left], A[right]});                 left++;                 right--;                                  while (left < right && A[left] == A[left - 1])                     left++;  // 避免重複的組合                                  while (left < right && A[right] == A[right + 1])                     right--;  // 避免重複的組合             } else if (sum < S) {                 left++;             } else {                 right--;             }         }     }          return result; }  int main() {     vector<int> A = {1, 2, 3, 4, 5, 6, 7, 8, 9};     int S = 15;          vector<vector<int>> combinations = findCombination(A, S);          if (combinations.empty()) {         cout <<  No combination found.  << endl;     } else {         cout <<  Combinations found:  << endl;         for (const auto& combination : combinations) {             cout << combination[0] <<   +   << combination[1] <<   +   << combination[2] <<   =   << S << endl;         }     }          return 0; }  1. 為何要排序？  排序是為了在後續查找中使用雙指針法，我們需要找到陣列 A 中的三個數字加總為 S 的組合。排序後，我們可以使用兩個指針（left 和 right）來進行查找，從而有效地避免重複計算和處理。  2. 如何改寫成遞迴？  若要改寫成遞迴，可以將函數改為遞迴形式，其中遞迴的終止條件是找到三個數字加總為 S 的組合或者陣列 A 中的數字不足三個。  vector<vector<int>> findCombination(vector<int>& A, int S, int startIndex, int count) {     vector<vector<int>> result;     if (count == 3) {         if (S == 0) {             result.push_back({});         }         return result;     }          int n = A.size();     for (int i = startIndex; i < n; i++) {         if (i > startIndex && A[i] == A[i - 1]) {             continue;  // 避免重複的組合         }         if (A[i] > S) {             break;  // A 已排序，後續數字皆大於 S，不可能有組合         }                  int num = A[i];         vector<vector<int>> subCombinations = findCombination(A, S - num, i + 1, count + 1);         for (auto& combination : subCombinations) {             combination.insert(combination.begin(), num);             result.push_back(combination);         }     }          return result; }  int main() {     vector<int> A = {1, 2, 3, 4, 5, 6, 7, 8, 9};     int S = 15;          vector<vector<int>> combinations = findCombination(A, S, 0, 0);          if (combinations.empty()) {         cout <<  No combination found.  << endl;     } else {         cout <<  Combinations found:  << endl;         for (const auto& combination : combinations) {             cout << combination[0] <<   +   << combination[1] <<   +   << combination[2] <<   =   << S << endl;         }     }          return 0; }
評論: 1. 為何要排序？  2. 如何改寫成遞迴？ Nice responses.