我在解决一本书上的练习题时,偶然发现了这个问题:
*描述一种递归算法,该算法将检查整数数组A是否包含整数Ai,该整数Ai是A中较早出现的两个整数的和,即
A[i] = A[j] +A[k] for j,k < i.
*
我已经考虑这个问题几个小时了,但是还没有想出一个好的递归算法。
发布于 2011-08-31 03:45:07
没有任何循环(伪代码)的递归解决方案:
bool check (A, i, j, k)
if (A[j] + A[k] == A[i])
return true
else
if (k + 1 < j) return check (A, i, j, k + 1)
else if (j + 1 < i) return check (A, i, j + 1, 0)
else if (i + 1 < A.size) return check (A, i + 1, 1, 0)
else return false
使用check(A, 2, 1, 0)
调用递归函数。为了突出显示算法的主要部分,它不检查数组最初是否有两个以上的元素。
发布于 2011-08-29 11:49:39
效率不是很高,但是..
search(A, j, k) {
for (int i = 0; i < A.length; i++) {
if (A[i] == A[j] + A[k]) {
return i;
}
}
if (k + 1 == A.length) {
if (j + 1 < A.length) {
return search(A, j + 1, 0);
}
return -1; // not found
}
return search (A, j, k + 1);
}
使用以下命令开始搜索
search(A, 0, 0);
发布于 2020-06-01 03:33:05
/**
* Describe a recursive algorithm that will check if an array A of integers contains
* an integer A[i] that is the sum of two integers that appear earlier in A,
* that is, such that A[i] = A[j]+A[k] for j,k < i.
* @param A - array
* @param i - initial starting index (0)
* @param j - initival value for j (0)
* @param k - initial value for k (0)
* @param n - length of A - 1
* @return - true if combination of previous 2 elements , false otherwise
*/
public boolean checkIfPreviousTwo(int[] A, int i, int j, int k, int n){
if(i >= n) return false;
if(j < i && k < i){
if(A[j] + A[k] == A[i]) return true;
return(
checkIfPreviousTwo(A, i, j + 1, k, n) ||
checkIfPreviousTwo(A, i, j, k + 1, n)
);
}
return checkIfPreviousTwo(A, i + 1, j, k, n);
}
https://stackoverflow.com/questions/7225823
复制相似问题