2011-12-03 2 views
0

이 코드가 코드에서 사용될 수 있는지 궁금합니다. 만약 내가 실행하고 싶었던 코드 블럭이 프로그램의 많은 부분에서 동일했고 while 루프의이 버전을 사용했다면,이 코드가 작동할까요? 대신 while 루프를 작성While 루프 기능이 있습니까?

NSMutableArray *objects; 
-(void) RemoveObjectLoop 
{ 
    [self RemoveObjectAtZero]; 
} 

-(void) RemoveObjectAtZero 
{ 
    if([objects count] > 0) 
    { 
     [objects removeObjectAtIndex:0]; 
     [self RemoveObjectLoop]; 
    } 
} 

여러 번 그냥 [RemoveObjectLoop 자기] 할 (내가 while 루프를 사용할 수 있다는 것을 알고는, 난 그냥이 탐구하는 흥미로운 아이디어라고 생각했다). 이 작업이 프로젝트에서 가능합니까? 이것을 사용하고 싶지 않은 인스턴스가 있습니까?

편집 :이 예제가 좋지 않다는 것을 알고, 나는 단지 다른 것을 생각할 수 없습니다. 가능한 경우 답변에 예제를 포함하십시오. 감사!

+1

[yourObject removeAllObjects]를 사용하십시오. – Aravindhan

+1

실용적인 예가 아니라는 것을 나는 안다. 사실 그것은 끔찍하다. 실제 질문에 대답 해주세요, 고마워요! : D – Telinir

+0

또한 yourObject 대신 [yourArray removeAllObjects]를 넣지 않습니까? : P – Telinir

답변

1

재귀에서는 일반적으로 이와 같은 순환 함수 호출이 없습니다. 함수는 결론을 향해 작업하는 동안 자체를 호출합니다. 그래서 예 될 것이다 : (재귀 호출 함수의 마지막 줄입니다) (로고 등)

-(void) RemoveAll 
{ 
    if([objects count] > 0) 
    { 
     [objects removeObjectAtIndex:0]; 
     [self RemoveAll]; 
    } 
} 

일부 언어가 자동으로 꼬리 재귀를 최적화합니다. 나는 Objective-C가 그렇게하는 것을 들어 본 적이 없으며, 그렇게한다면 놀랄 것이다.

일반적으로 (당신이 지적한대로 중요한 질문입니다.) 재귀 예제는 인위적이며 비 반복적으로 더 잘 풀릴 것입니다. Here are some real-world examples of recursion.

+0

설명하고 예제를 제공해 주셔서 감사합니다! – Telinir

+1

반갑습니다. 프로그래밍 유형에 따라 재귀를 사용하지 않고도 몇 년 간 갈 수 있지만, 지금은 문제를 해결하는 거의 마법 같은 우아한 방법이므로 도구 상자에 넣는 것이 좋습니다. – SSteve

3

이것은 재귀라고합니다. 그것을 최적화하지 않는 언어에서는, 함수에 필요한 프레임을 저장하기 위해 스택 공간이 부족하기 때문에 적당한 크기의 콜렉션에서만 사용할 수 있습니다. 또한 컴파일러가 최적화하지 않는 한 정상적인 루프보다 다소 느립니다.

일부 알고리즘의 경우 적합합니다. 예를 들어, 깊이 우선 검색은 당연히 재귀 함수로 구현됩니다. 나는 이것이 그 경우 중 하나라고 생각하지 않습니다.

+0

감사합니다 척! 예제가 나쁘다는 것을 알고 있습니다. 미안합니다 : D – Telinir