도움이 필요합니다. 이 코드는 sum
까지 합쳐진 n
크기의 배열 set[]
이 있는지 찾아내는 C 코드를 가지고 있습니다.C - 루프가없는 서브 세트 합계를 재귀 적으로 찾습니다.
예 : 대한
n = 3;
sum = 6;
하지만 거짓 :
n = 1;
sum = 4;
정립-2 일부
{1,3} = 4
그것도와 사실 때문에
set[] = {1,2,3};
n = 2;
sum = 4;
위의 코드가 true 반환
일부 경우에는 작동하지만 드라이버의 대소 문자가 반환되지 않습니다. 이 코드에서 드라이버에 대해 올바르게.
#include <stdio.h>
bool isSubsetSum(int set[], int n, int sum)
{
// Base Cases
if (sum == 0)
return true;
if (n == 0 && sum != 0)
return false;
if (set[n-1] > sum)
return isSubsetSum(set, n-1, sum);
return isSubsetSum(set, n-1, sum) || isSubsetSum(set, n-1, sum-set[n-1]);
}
// Driver program to test above function
int main()
{
int set[] = {6,5,6};
int sum = 12;
int n = 2;
if (isSubsetSum(set, n, sum) == true)
printf("Found a subset with given sum");
else
printf("No subset with given sum");
return 0;
}
JAVA 적응 : 나는 매개 변수를 변경할 수 없으며 루프
의 어떤 종류를 사용하지 않고 코드가 여기에 있습니다 (너무 오류) n은이다 부분 집합의 크기
public static boolean isSubsetSum(int[] set, int n, int sum) {
int[] copy = new int[set.length - 1];
System.arraycopy(set, 0, copy, 0, set.length - 1);
// Base Cases
if (sum == 0 && n == 0)
return true;
if (set.length == 0) // fixed base case.
return false;
if (set[set.length - 1] > sum) {
return isSubsetSum(copy, n, sum);
}
return isSubsetSum(copy, n, sum) || isSubsetSum(copy, n-1, sum - set[set.length-1]);
}
드라이버의 실패 사례에 대해 더 명확히 말할 수 있습니까? – Coconop
모든 루프는 재귀를 사용하여 프로그래밍 할 수 있습니다 (충분한 스택이 있거나 꼬리 - 호출 최적화가있는 한). 람다 계산에 감사드립니다. – pat
@Michelle 그리고 너는 틀렸어. 루프를 사용하여 수행 할 수있는 모든 작업은 재귀를 사용하여 수행 할 수도 있습니다. 또한, 서브 세트 합은 루프 이외에 추가 DS를 계산할 것을 요구한다. (DP를 사용하는 경우 행렬 또는 무차별 대항에서 모방 재귀의 스택) – amit