카테고리 없음

[C ++] 이 재귀가 분할 오류를 제공하는 이유는 무엇입니까?

필살기쓰세요 2021. 1. 22. 17:38

다음은 사용해야하는 코드입니다.

#include <iostream>
using namespace std;

int sum_to(int value)
{   
    if(value <= 1)
            return 1;
                return sum_to(value-1) + value;
                }
                
                int main()
                {
                    int value = 5;
                        std::cout << "sum to " << value << " is " <<  sum_to(value) << '\n';
                            return 0;
                            }
                            

중간 상태를 인쇄

temp

하려면 중간 결과를 저장하고 인쇄 할 변수가 하나 더 필요 합니다.

#include <iostream>
using namespace std;

int sum_to(int value)
{   
    if(value <= 1)
            return 1;
                int temp = sum_to(value-1) + value;
                    std::cout << "sum to " << value << " is " <<  temp << '\n';
                        return temp;
                        }
                        
                        int main()
                        {
                            int value = 5;
                                std::cout << "sum to " << value << " is " <<  sum_to(value) << '\n';
                                    return 0;
                                    }
                                    

문제는 항상 똑같기

sum_to

때문에하지 말아야 할 곳에서 전화를 거는

value

것이 었습니다.

int sum_to(int value)
{   
    std::cout << "sum to " << value << " is " << sum_to(value)  << '\n';
        if(value <=1)   {                            ^^^^^^^^^^^^^ this call
                return 1;
                    }
                        else    {
                                return sum_to(value-1) + value;
                                    }
                                    }
                                    

-------------------
종료 조건을 확인

하기 전에

무한 재귀 가 있습니다. 다시

std::cout

호출하지 않도록 변경하십시오

sum_to

.-------------------

else

신체를 다음으로 대체 할 수 있습니다 .

    int intermediate = sum_to(value-1) + value;
    cout << "Intermidiate: " << intermediate << endl;
        return intermediate;
        

-------------------
다음과 같은 몇 가지 개선 사항이 있습니다.

  1. 첫 번째 cout을 제거하여 끝없는 재귀를 제거하십시오.
  2. 재귀 호출 후 log / cout을 추가합니다.
    int sum_to(int value)  
        {  
            if(value <=1) {  
                    return 1;  
                        }  
                            else {  
                                    int result = sum_to(value-1);  
                                            cout << "Sum to " << (value-1) << " is " << result << '\n';  
                                                    return result + value;  
                                                        }  
                                                        }
                                                        



출처
https://stackoverflow.com/questions/39917078