2013-04-08 2 views
0

왜 재귀 알고리즘이 작동하지 않는지 잘 모르겠습니다. 나는 아래의 오류를 얻지 만, 나는 내 마음 속에 그것이 종말점을 가지고있는 것 같아. 나는 단순한 것을 잊고 있다는 것을 알고있다.왜 재귀가 작동하지 않습니까? 경고 : Project Euler spoiler

RuntimeError에 : 최대 재귀 깊이 당신은 트리플을 생성하는 유클리드의 방법의 변형을 사용하는

def triplet(n): 
    a = (2*n) +1 
    b = (2*n)*(n+1) 
    c = (2*n)*(n+1) +1 

    if a+b+c == 1000: 
     return a*b*c 
    elif a+b+c > 1000: 
     return 'no triplet found' 
    else: 
     return triplet(n+1) 

print triplet(1) 
+3

'a + b + c == 1000'에 대해 'n'이 없으면 어떻게 될까요? –

+0

네, 제 친구 알렉스가 문제입니다. + a + b + c == 1000 – jsedano

+0

또한 a + b + c> 1000이면 안전하게 삼중 항 검색을 중지 할 수 있습니다. – piokuc

답변

3

를 초과했습니다. 그러나 모든 가능한 트리플을 생성하지 않으므로 문제를 해결하는 데 필요한 트리플을 생성하지 않습니다.

사실 피타고라스의 모든 트리플을 생성하는 보편적 인 공식은 없습니다. 분석적으로 솔루션을 찾거나 무차별 적으로 분석해야합니다.

+0

감사 Bhajun, 더 많은 연구를 할 시간 같아. – Alex

+0

예. 또한 다른 사람들의 말을 반복하면이 문제는 재귀가 아니라 반복을 요구합니다. –

2
보다 큰위한

확인 또는

def triplet(n): 
    a = (2 * n) + 1 
    b = (2 * n) * (n + 1) 
    c = (2 * n) * (n + 1) + 1 

    if a + b + c >= 1000: 
     return a * b * c 
    else: 
     return triplet(n + 1) 

print triplet(1) 
+0

'a * b * c'는 문제의 해결책으로 간주됩니다. 대신'a + b + c> 1000 '과 같은 오류 값을 반환하는 다른 조건문을 추가해야합니다. 또한 재귀 오류는 해결되지만 문제 자체는 해결되지 않습니다. –

+0

어떤 문제를 풀려고하는지는 모르지만 질문은 '왜 내 재귀가 작동하지 않는 것입니까?'입니다. + b + c가 정확히 1000이 아니라면 출구가 없어서 재귀 오류가 해결되었습니다. 문제 자체는 무엇이 요구되었는지 전혀 다른 질문입니다. – Yoriz

0

가 확실 재귀/유클리드의 방법은이 일을하고 가야하는 가장 좋은 방법입니다 있습니까 같다? 나는 1000을 합친 값을 유지하고 두 개의 독립 변수를 변화시키고 그들이 동등한지를 확인함으로써 이것을 기억합니다. (나는 또한 검사 할 솔루션의 수를 줄이기 위해 일종의 삼각형 부등식을 사용했지만, 대부분 1 백만 개의 가능성을 검사 할만큼 필요하지는 않습니다.)