루비의 재귀 함수에서 스택 오버플로 오류에 대한 해결 방법이 있습니까? 재귀 루틴의 "stack level too deep"오류에 대한 해결책이 있습니까?
def countUpTo(current, final)
puts current
return nil if current == final
countUpTo(current+1, final)
end
내가 countUpTo(1, 10000)
를 호출하는 경우
stack level too deep (SystemStackError)
를
는 말, 예를 들어,이 블록을 가지고있다.
8187에서 멈추는 것처럼 보입니다. 루비가 스택의 크기를 무시하도록하거나 최대 스택 크기를 늘리는 방법이 있습니까?
당신은 아닌 조각을 다시 작성할 수 있습니다
이렇게하지 마십시오. 당신이 의도적으로 10,000 번을 recusing한다면, 당신은 잘못하고 재귀를 악용하고 있습니다. – meagar
Ruby 구현은 반드시 꼬리 호출 제거를 수행하지 않으므로 C 스택 크기 사용에 의존합니다. 한 가지 가능성은 반복적으로 함수를 다시 작성할 수 있다는 것입니다. – birryree
첫째, Ruby에 대한 저의 경험은 재귀에서 특히 좋지 않습니다.이 오류는 매우 쉽게 발생하고 느리다는 것입니다. 또한,이 영역에서 더 나은 성능을 얻으려면 Ruby를 특정 상수 세트로 컴파일해야하지만,별로 도움이되지 않았습니다. 즉,'times','upto'와 같은 일반적인 Ruby 메소드를 사용하여 함수를 다르게 작성하십시오. 목표가 무엇인지 알지 못한다면, 당신이 그 주장을 할 수 있다고 생각하지 않습니다. 나는 하스켈에서 몇 번이나 문제없이 반복적으로 반복하는 방법을 썼다. – iain