나는 지난 이틀 동안 특정 마스터의 Github를보고 그가 알고리즘에 더 관심이 있다는 것을 알았습니다. 숫자를 계산하기위한 단계 알고리즘 중 하나를 읽은 후, 나는 이것이 조금 흥미 롭다고 생각했기 때문에 나는 혼자서 깨달았습니다.
알고리즘 설명 및 구현 원리
정수 번호가 주어지면 숫자 4와 같이 목표에 도달 할 수있는 방법의 수를 계산하면 다음과 같은 방법이 있습니다.
코드 사본은 다음과 같습니다.
[1, 3]
[4]
[1, 1, 2]
[스물 22]
[1, 1, 1, 1]
실제로, 위의 조합을 통해 다음과 같은 결론을 도출 할 수 있습니다.
1. 첫 번째 목록 모든 항목은 1의 조합입니다.
2. 왼쪽에서 오른쪽으로 1의 조합
3. 항목에서 1의 색인 1을 재귀 적으로 찾은 다음 왼쪽에서 2 개의 항목 값을 계산 하고이 작업을 재귀 적으로 계산합니다.
4. 1과 2의 상황을 제외합니다
다음은 세 가지 도구 기능입니다.
코드 사본은 다음과 같습니다.
// 배열의 값을 계산합니다
함수 계산 (arg) {
return eval (arg.join ( '+'));
}
// 배열 값을 출력합니다
함수 print (arg) {
for (var i = 0; i <arg.length; i ++) {
Console.log (arg [i]);
}
}
// 옳고 그른 방법인지 확인
함수 hasrepeat (src, dist) {
if (dist.length! = 2) false를 반환합니다.
for (var i = 0, len = src.length; i <len; i ++) {
if (dist.length == src [i] .length) {
if (dist [0] == Src [i] [1]) {
진실을 반환하십시오.
}
}
}
거짓을 반환합니다.
}
다음은 알고리즘의 구현입니다.
코드 사본은 다음과 같습니다.
함수 countsteps (n) {
var counts = 0, i, j = 0;
var result = [];
var newresult = [];
var source = [];
var temparg = [];
// 1의 모든 항목으로 배열을 생성합니다
for (i = 1; i <= n; i ++) {
source.push (1);
}
if (n> 2) {
for (j = 1; j <n -1; j ++) {
temparg.length = 0;
if (j <n -1) {
// 왼쪽에서 오른쪽으로 1 단위로 배열을 생성합니다.
// 1 .. 11 .. 111 ..
Array.prototype.push.apply (Temparg, source.slice (0, j));
temparg.push (계산 (source.slice (j, n));
result.push (temparg.slice (0));
// 항목에 1이 없을 때까지 재귀 배열의 내용
결합 (temparg.slice (0));
}
}
}
// 1이 포함 된 배열 항목을 결합합니다
// 111-> 21-> 3
함수 결합 (arg) {
var linearg = [];
for (var i = 0; i <arg.length; i ++) {
if (arg [i] == 1) {
if (i == 0 || i == 1) {
linearg.push (계산 (arg.slice (0,2)));
Array.prototype.push.Apply (linearg, arg.slice (2, arg.length));
if (! hasrepeat (result, linearg)) {
result.push (linearg);
결합 (linearg.slice (0));
}
반품;
}
}
}
}
// 2 일 때는 1 이상이 있습니다
if (n == 2) {
result.push ([2]);
}
// 1을 모두 추가합니다
result.push (소스);
// 모든 단계를 출력합니다
인쇄 (결과);
console.log ( '총 :' + result.length + '의 걷기 방법');
}
// 달리다
카운트 스텝 (4);
// 다음 내용을 출력합니다
/*
[1, 3]
[4]
[1, 1, 2]
[스물 22]
[1, 1, 1, 1]
총 5 가지 유형의 걷기가 있습니다
*/
요약
이 알고리즘은 실제로 특정 유형의 게임에 적용될 수 있습니다. 두 객체 사이의 거리는 확실한 경우, 가능한 모든 처리를 수행 할 수 있으며 물론 다른 장소에도 적용 할 수도 있습니다. 대부분의 프론트 엔드 엔지니어는 알고리즘에 대한 관행이 적지 만 여전히 가치가 있습니다. 많은 UI 세부 사항은 실제로 알고리즘을 사용합니다. 시간이있을 때 알고리즘에 대한 더 많은 기사를 게시하겠습니다. 모두에게 귀중한 제안을 할 수 있습니다.