소백안의 귀속

4284 단어
소백으로서 귀환과 관련된 가장 먼저 떠오르는 것은 반드시 귀환 종지 조건이 있어야 한다는 것이다. 그렇지 않으면 사순환을 구성할 것이다.
귀환에 대해 주로 두 가지 부분이 있는데 첫째, 어떤 상황에서 귀환을 사용할 수 있는지, 둘째, 왜 귀환에서 항상return을 사용하는지 잘 모르겠다.
먼저 가장 간단한 계산 곱셈의 예로부터 말하자면
function factorial (n) {
  if (n === 1) {
    return 1
  }
  return n * factorial(n - 1)
}

console.log(factorial(3))

실행 순서:
factorial(3) ==> 3 * factorial(2) ==> 3 * 2 * factorial(1) ==> 3 * 2 * 1
factorial(3)을 실행할 때return3*factorial(2)에서의return이 없으면factorial(3)는 되돌아오는 값이 없다. 내부에서 어떻게 돌아가든지 그 값은undefined이다.
다음은 왜 귀환을 사용할 수 있는지 다시 한 번 말씀드리겠습니다.하나의 큰 문제를 작은 문제로 분해할 수 있고 작은 문제의 방법과 큰 문제의 방법은 같다. 단지 규모가 다르지만 또 하나는 지난번의 계산 결과를 사용하는 것이다. (이점에 관해서는 두 가지 상황이 있다. 하나는 위에서 계산한 곱셈을 직접 이용하는 예이고 다른 하나는 직접 이용하지 않는 것이다. 아래의 예는 바로 이런 상황이다) 그러면 귀속을 고려할 수 있다.
다음은 리코드에서 17번 전화번호의 알파벳 조합을 예로 들자.우리가 관심을 가지는 부분만 말하자면 전화번호의 2-9 숫자는 숫자마다 3개나 4개의 영문 자모에 대응한다. 사용자가 2-9의 몇 개의 숫자로 구성된 문자열을 입력한 후에 우리는 이 몇 개의 숫자에 대응하는 자모를 조합하여 숫자마다 하나의 자모를 내야 한다.
예제
 :"23"
 :["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

먼저 맵 수조를 만들어서 숫자와 알파벳 사이의 매핑을 만들고 전송된 숫자 문자열을 분석하여 대응하는 알파벳을 수조코드에 저장합니다. 예를 들어 '23'=>['abc','def'].전송된 숫자의 개수는 무작위이기 때문에 코드수 그룹의 앞의 두 항목의 자모를 조합한 후 tmp수 그룹에 저장하고code.splice(0,2,tmp)는 코드의 앞의 두 항목을 tmp로 바꾸고 코드 그룹의 길이가 1인지 판단하며, 그렇지 않으면comb 함수(귀속)를 계속 호출하여 이전에 조합된 자모와 뒤의 자모를 조합하고, 1이면 조합이 완료된 것을 설명한다.
const f = (str) => {
  //  , map[2] 2 
  let map = ['', 1, 'abc', 'edf', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
  //  , '234' ['2', '3', '4']
  let num = str.split('')
  //  ,  '23'=>['abc', 'def']
  let code = []
  num.forEach(item => {
    //  , 0 1 
    if (map[item]) {
      code.push(map[item])
    }
  })
  const comb = (code) => {
    let tmp = []
    for (let i = 0, il = code[0].length; i < il; i++) {
      for (let j = 0, jl = code[1].length; j < jl; j++) {
        tmp.push(`${code[0][i]}${code[1][j]}`)
      }
    }
    code.splice(0, 2, tmp)
    if (code.length <= 1) {
      return code[0]
    } else {
      return comb(code)
    }
  }
  console.log(comb(code))
}

f('234')

왜 comb(code) 앞에return을 넣을까요?이 이해는 위의 예보다 이해하기 쉽다. 리턴을 넣을 필요가 없을 것 같지만 사실은 그렇지 않다.
우선 집행 순서를 적어두고,
 : comb(['abc', 'def', 'ghi']) => 
 : comb([['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf'], 'ghi'])  

두 번째 comb 함수를 실행할 때 for 순환과 splice를 실행한 후 코드의 길이가 1이 됩니다. 이때 ['ageg','aeh','aeh','aei','adg','adh','adi','afg','afh','afi','beg','beg','beh','bei','bdg','bdg','bdh','bdi','bfg','bfffh','bfi','bfig','bg','bg','cg','cg','cg','cg','hh','cg','cg','cg','cg','cg','cg','cg','cg','cg','cg','cg','c,'cfg','cfh','cfi'].
이것은 두 번째 comb 함수 반환 결과입니다. 만약returncomb () 를 추가하면 첫 번째 호출 반환 결과는 두 번째comb 함수 집행 결과입니다. 만약return이 없다면, 첫 번째 호출 결과는undefined입니다.
귀환에서 종지 조건을 충족시켜 귀환하는 값은 모두 마지막으로 귀환 함수를 호출하여 집행한 결과이다. 최내층 귀환 함수의 집행 결과는 최외층 귀환 함수로 귀환하려면 각 층 귀환 함수에return을 추가해야만 된다.
요컨대, 귀속 함수가 마지막으로 결과를 되돌려 주기를 원한다면, 각 층의 귀속 함수는 반드시return을 넣어야만 내부 함수의 결과를 가장 바깥쪽 귀속 함수로 되돌릴 수 있다.
다음에 다시 한 번 말씀드리지만 왜 귀환을 사용할 수 있습니까?사용자가 입력한 숫자 문자열 중 숫자의 개수는 알 수 없지만 항상 두 알파벳 문자열을 조합할 수 있다(큰 문제와 작은 문제의 해결 방법은 일치한다). 먼저 두 알파벳 문자열을 조합하고 세 알파벳 문자열이 있으면그러면 앞의 두 조합 후의 결과를 수조의 앞의 두 항목(지난번에 귀속된 결과를 사용했음)으로 바꾸고 앞의 세 번째 알파벳 문자열과 조합한다.나머지 세 개의 알파벳 문자열은 동일합니다.
총결산하다
1) 큰 문제와 작은 문제의 해결 방법이 일치하고 지난번의 결과를 사용했다면 사용의 귀속을 고려할 수 있다.
2) 귀속 함수가 결과를 되돌려야 한다면, 귀속 함수를 호출할 때마다 앞에 리턴을 붙여야만 내부 함수의 귀환 결과를 최외층 함수로 되돌릴 수 있다.
3) 가장 바깥쪽 함수의 반환 결과는 모든 안쪽 함수의 집행이 끝난 후의 반환 결과이다.내층 함수는 외층 함수의 집행 내용으로 집행이 끝난 후에 최종적으로 되돌아오는 결과는 외층 함수의 집행 결과이다.

좋은 웹페이지 즐겨찾기