JavaScript의 재귀 및 반복의 각각의 장점에 대한 자세한 코드 설명

伊谢尔伦
풀어 주다: 2017-07-26 17:37:47
원래의
1711명이 탐색했습니다.

재귀 및 루프

반복적인 계산이 필요한 다양한 유형의 문제에 대해 루프 및 재귀 방법은 각자의 장점이 있으며 보다 직관적이고 간단한 솔루션을 제공할 수 있습니다. 반면, 루프 방식과 재귀 방식은 서로 변환될 수 있습니다. 동일한 기능을 달성하기 위해 재귀를 사용하여 코드 루프를 다시 작성할 수 있습니다. 일반성을 잃지 않으면서 루프와 재귀는 다음 의사 코드를 사용하여 요약할 수 있습니다.

의사 코드 형식 설명: 루프는 while 형식을 채택하며 변수는 정의되지 않습니다. 할당은 조건식과 실행된 명령문을 함수 형식으로 작성하고 관련 값을 괄호 안에 작성합니다. 다른 구문 측면에서는 가능한 한 Javascript 사양에 가깝게 하십시오.

//pseudo code of a loop 
//while形式 
function loop(arguments){ 
//结果的初始值 
result:=initial_value; 

while(condition(variable, arguments)){//循环条件,可能只需arguments,也可能为了方便引入循环变量 
//计算结果。参数包括之前的结果、当前循环变量和外部变量 
result:=calculate(result, variable, extern_variables); 
//影响函数的外部环境,即修改外部变量 
changeStatus(result, variable, extern_variables); 
//执行完循环体中的语句后,修改参数或循环变量。 
modify_arguments_variable(arguments, variable); 
} 
//返回结果 
return result; 
}
로그인 후 복사

마찬가지로 재귀 함수의 의사 코드를 제공합니다.

//pseudo code of a recursion 
function recursion(arguments){ 
//以下代码为控制函数重复调用的结构部分。 
//获得再次调用此函数的新的参数,可能为多组arguments值。 
//对应于循环中的condition(variable, arguments)和modify_arguments_variable(arguments, variable)。 
new_arguments:=conditional_get_next(arguments); 
//对新参数的每一组,调用函数自身。 
results:=recursion(new_arguments); 
//以下的代码为每次调用都运行的功能部分 
//计算结果。涉及到之前的结果、当前循环变量和外部变量。 
//对应于循环中的result:=calculate(result, variable, extern_variables)。 
result:=calculate(arguments, extern_variables); 
result:=combine(result, results); 
//影响函数的外部环境,即修改外部变量 
changeStatus(result, arguments, extern_variables); 
return result; 
}
로그인 후 복사

두 코드를 비교해 보면 루프와 재귀의 구성이 비슷하다는 것을 알 수 있습니다. 순서를 변경하고 적절하게 변환하면 모든 루프를 재귀적인 방식으로 구현할 수 있습니다. 이 변환은 프로그램이 단순할 때 쉽게 볼 수 있습니다. 예를 들어, 다음과 같은 단순 누적 합계 함수:

//loop 
function sum(num){ 
var result=1; 
while (num>1){ 
result+=num; 
num--; 
} 
return result; 
}
로그인 후 복사

해당 재귀 형식:

//recursion 
function sum2(num){ 
if (num>1){ 
return num+sum(num-1); 
}else{ 
return 1; 
} 
}
로그인 후 복사

반대로 대부분의 재귀 프로그램은 루프를 통해 직접 구현할 수도 있습니다. 다음은 최대 공약수를 구하는 루프 형태의 함수입니다.

function gcd2(a, b){ 
var temp; 
if (a<b){ 
temp=a; 
a=b; 
b=temp; 
} 
var c=a%b; 
while (c!==0){ 
a=b; 
b=c; 
c=a%b; 
} 
return b; 
}
로그인 후 복사

그러나 재귀에서 루프로의 변환이 항상 쉬운 것은 아닙니다. 이 함수를 다시 호출하기 위해 새로운 인수를 생성하는 재귀 의사 코드 부분(

new_arguments:=conditional_get_next(arguments);
로그인 후 복사

)은 루프 부분보다 더 유연합니다. 재귀는 새로 생성된 매개변수 그룹의 수에 따라 두 가지 범주로 나눌 수 있습니다(함수에 필요한 모든 매개변수는 하나의 그룹입니다). 첫 번째 유형은 매개변수 그룹의 수가 고정되어 있고 재귀가 피보나치 수열과 최대 공약수 예시와 같은 루프로 변환될 수 있는 경우입니다. 두 번째 유형은 매개변수 그룹의 수가 불확실한 경우입니다. 그래프나 트리를 탐색할 때 각 점에는 임의 개수의 인접 점이 있습니다. 이 재귀는 루프로 직접 변환될 수 없습니다.

루프는 1차원 반복만 할 수 있는 반면 재귀는 2차원 구조를 탐색할 수 있기 때문입니다. 예를 들어, 트리에서 노드에는 동일한 수준의 하위 노드와 노드가 모두 있습니다. 간단한 1차원 루프는 양방향으로 이동할 수 없습니다. 그러나 두 번째 유형의 재귀는 루프의 일부 데이터 구조를 사용하여 노드 위치에 대한 일부 정보를 기억하는 경우 루프를 사용하여 구현할 수도 있습니다.

결론적으로 말하자면. 모든 루프는 재귀를 사용하여 구현할 수 있습니다. 모든 재귀는 루프를 사용하여 구현할 수 있습니다. 어떤 방법을 사용하는지는 특정 문제와 사용자의 선호도에 따라 어떤 아이디어가 더 편리하고 직관적인지에 따라 다릅니다.

위 내용은 JavaScript의 재귀 및 반복의 각각의 장점에 대한 자세한 코드 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿