재귀 및 루프
반복적인 계산이 필요한 다양한 유형의 문제에 대해 루프 및 재귀 방법은 각자의 장점이 있으며 보다 직관적이고 간단한 솔루션을 제공할 수 있습니다. 반면, 루프 방식과 재귀 방식은 서로 변환될 수 있습니다. 동일한 기능을 달성하기 위해 재귀를 사용하여 코드 루프를 다시 작성할 수 있습니다. 일반성을 잃지 않으면서 루프와 재귀는 다음 의사 코드를 사용하여 요약할 수 있습니다.
의사 코드 형식 설명: 루프는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!