2013-05-28 4 views
3

저는 초보자이고 값이 적은 배열의 모든 원소의 합을 반환하는 재귀 알고리즘을 작성하려고합니다. x보다. "C4715 경고 : 'sumOfElement를'내가 코드를 실행하는 동안, 나는이 경고를 가지고, 비주얼 스튜디오를 사용하고x보다 작은 값을 가진 배열의 모든 원소를 합산하는 재귀 알고리즘

#include <iostream> 

using namespace std; 

int sumOfElement(int xList[],int x, int lengthOfArray){ 
    int sum = 0; 
    if (lengthOfArray == 0) 
     return sum; 
    else 
     for (int i=0; i <= lengthOfArray; i++) { 
      if(xList[i] < x) 
       return sum + xList[i]; 
      else 
       sumOfElement(xList,x,lengthOfArray-1); 
    } 
} 


int main() { 
    cout << "Size of Array: "; 
    int size; 
    cin >> size; 
    int *xList = new int[size]; 

    //Inputing array. 
    cout << "Enter elements of array followed by spaces: "; 

    for (int i = 0; i<size; i++) 
     cin >> xList[i]; 

    cout << "Enter the integer value of x: " <<endl; 
    int limit; 
    cin >> limit; 

    cout << "Sum of every element in an array with a value less than x: " << sumOfElement(xList,limit,size) << endl; 

    return 0; 
} 

: 여기

내 코드는 모든 제어 경로 값을 반환 "그리고 x의 정수 값을 입력하라고 요구할 때 프로그램은 항상 실행을 멈 춥니 다.

내 코드에 어떤 문제가 있습니까?

+3

'(lengthOfArray = 0)'보이지 않는 권리 – Blender

+1

앞에'for' 루프는 반복하지 재귀의 예입니다 경우. 이 둘 사이에 엄격한 동등성이 있지만, 같은 결과는 아닙니다. 동일한 최종 결과를 얻을 수 있지만 다른 방식으로 수행 할 수 있습니다. 재귀에는 명시 적 루프가 없습니다. 함수 자체가 (아마도 다른 함수를 통해 간접적으로) 호출됩니다. – Steve314

답변

2

여기에 귀하의 접근 방식은 정말 재귀하지 안됩니다. 재귀를 사용하는 아이디어는 기본 사례를 고려한 다음 기본 사례에 도달 할 때까지 각 단계에서 문제를 줄이는 방법을 고려하는 것입니다. 이 문제에 대한

: 배열의 길이가 제로인 경우

  • 기저 케이스이다. 이 경우 우리는 0의 합을 반환합니다. (직관적으로 : 배열이 비어 있다면 아무 것도 추가하지 않고 0의 합을줍니다.)
  • 배열을 줄이기 위해 배열의 마지막 요소 (예 : lengthOfArray - 1)를 봅니다. 이 요소를 처리합니다. x보다 작 으면 추가하고, 그렇지 않으면 무시합니다. 그런 다음 같은 방법으로 (배열 길이가 다른 동일한 함수를 호출하여) 나머지 배열을 처리 한 결과를 얻고 해당되는 경우 결과를 추가합니다.

그래서, 몇 가지 예제 코드 :

int sumOfElement(int xList[], int x, int lengthOfArray){ 
    if (lengthOfArray == 0) { 
     // base case 
     return 0; 
    } else { 
     int value = xList[lengthOfArray-1]; 
     if (value < x) { 
      // process the rest of the array and add our result 
      return value + sumOfElement(xList, x, lengthOfArray - 1); 
     } else { 
      // process the rest of the array 
      return sumOfElement(xList, x, lengthOfArray - 1); 
     } 
    } 
} 
+0

꼬리 재귀를 사용하려면'value = (value Eugene

+0

@Eugene 꼬리 재귀가 아닙니다. 꼬리 재귀 모 놀리 콘입니다. 내 함수는 실제로 더 많은 꼬리 재귀입니다 (두 번째 else 분기는 꼬리 재귀입니다. 반면에 'value mange

2
for (int i=0; i <= lengthOfArray; i++) 
{ 
    if(xList[i] < x) 
     return sum + xList[i]; 
    else sumOfElement(xList,x,lengthOfArray-1); 
} 

당신은, 그리고 재귀 함수해야 "반환"깊은 호출, 루프에 대해 너무

int retVal = 0; 
if(xList[lengthOfArray-1] < x) 
    retval = xList[lengthOfArray-1] 
return retVal + sumOfElement(xList,x,lengthOfArray-1); 
+1

그래서 더 이상 고리가 없다면 어디에서'i'가 나올까요? 또한'sum + xList [i]'는 나머지 배열을 어떻게 처리합니까? – mange

+0

'i'의 사용을 수정했습니다. –

+0

여전히'xList [lengthOfArray-1] mange

관련 문제