본문 바로가기

반응형

전체 글

거듭제곱, 최대공약수, 소수판정 최적화 (+ 확률에 의한 판정) 특정 산술 계산들에 적용할 수 있는 최적화 아이디어를 살펴보자. 거듭제곱 bⁿ 을 구하는 재귀함수는 다음과 같이 작성할 수 있다. function exp(b, n){ return n === 0 ? 1 : b * exp(b, n - 1); } 이 때의 증가차수는 O(n)이 될 것이다. 여기서 다음 연속제곱식을 이용하면 증가차수를 O(logn)으로 줄일 수 있다. bⁿ = (b½ⁿ)² : n = 짝수 bⁿ = b * bⁿ⁻¹ : n = 홀수 코드로 나타내면 다음과 같다. function exp(b, n){ return n === 0 ? 1 : n % 2 === 0 ? exp(b, n / 2) ** 2 : b * exp(b, n - 1); } exp(b, n / 2) 으로 치환할 때마다 필요한 단계수가 절반으.. 더보기
고차함수를 이용한 추상화 고차함수란? 동일한 프로그래밍 패턴이 서로 다른 여러 함수에 쓰이는 경우를 흔히 볼 수 있다. 이런 패턴을 하나의 추상적 개념으로 표현하기 위해 함수를 인수로 받거나 함수를 값으로 돌려주는 함수가 아주 유용하게 쓰일 수 있는데, 이러한 함수를 고차 함수(higher-order function)라고 한다. 고차함수는 추상의 관점에서 문제를 고찰하고, 그런 추상들을 프로그래밍 언어의 요소들로서 명시적으로 표현할 수 있게하여 추상들을 여타 계산 요소들과 마찬가지 방식으로 다룰수 있게 한다는 점에서 중요하다. 또, 자바스크립트에서는 함수에 일급요소 자격을 부여하기 때문에 고차함수를 유연하게 정의하고 사용할 수 있다. 일급요소란? 프로그래밍 언어는 계산적 요소들의 조작 방식에 이런저런 제약을 가하는데, 이 제약이.. 더보기
꼬리재귀(tail-recursion)와 꼬리 호출 최적화(TCO) 재귀함수를 사용할 때는 콜스택 증가로 인한 메모리 낭비, stack overflow 발생 위험을 조심해야 한다.이 때 재귀함수를 꼬리재귀 형태로 작성할 수 있다면 이 문제를 회피할 수도 있다. 몇몇 언어에서(특히 함수형 언어)는 꼬리 호출 최적화(TCO: Tail-Call Optimization)를 지원하기 때문이다.꼬리재귀(tail-recursion)재귀함수의 리턴값이 재귀호출의 반환값인 상황을 꼬리재귀라고 한다.꼬리 호출 최적화 (TCO: Tail call optimization)TCO(Tail call optimization)는 꼬리재귀 함수 호출시 스택 프레임을 재사용하는 최적화 방식이다. 스택에 쌓인 호출 정보를 새로운 호출에 대한 것으로 업데이트하여 메모리 사용량을 줄일 수 있다.꼬리 호출 최.. 더보기
선언적 vs 명령적 프로그래밍 패러다임에 관한 아티클을 보다보면 "~는 선언적이라서 가독성이 좋다" 라는 표현을 종종 접하게 된다. 그런데 코드가 선언적이라는 말이 정확히 의미하는 바가 대체 뭘까? how보다 what에 관심을 두는 것? 함수형 컴퓨팅에 쓰이는 프로그래밍 패러다임? 명령형은 뭔가 if문이 많은것 같고... 선언형은 뭔가 명료하다!? 선언형 방식으로 작성되었다는 코드를 직접 보면 무슨 느낌인지는 알겠는데... 이게 그래서 명확하게 무엇인지 말하려고 하면 정의 보다는 선언적 프로그래밍의 특징, 느낌적인 느낌...정도 만을 나열하게 된달까. 그런 의문을 품고있던 중 SICP 책에서 기술하는 선언적 지식과 명령적 지식(선언적 지식과 자주 대비되는)의 정의가 퍽 와닿았다. 명령적 지식(imperative kno.. 더보기
프로그래밍 언어의 기본 요소 프로그래밍언어는 일련의 과정에 관한 생각들을 조직화하는 틀로써 작용할 수 있다. 단순한 아이디어(or 매커니즘)들을 조합해서 복잡한 아이디어를 조직하는 것이다. 강력한 컴퓨팅 언어들은 다음 세가지 매커니즘을 제공한다. 원시 표현식(primitive expression) 수단 언어와 관련한 가장 단순한 객체 조합(combination) 수단 여러개의 단순한 요소들을 이용하여 복합적인 요소를 만듦 추상화(abstraction) 수단 복합적 요소에 이름을 붙여 하나의 단위로 다룸 표현식 표현식은 원시표현식, 연산자 조합으로 구성될 수있다. 원시 표현식 number, bigint, string, null, undefined, boolean, Symbol 연산자 조합 피연산자 + 연산자 표현식 형태의 조합 이름 .. 더보기
함수 표현식 vs 함수 선언식 vs 화살표 함수 함수 표현식 var myFunction = function [name]([params]) { statement }; 이름을 생략하면 익명함수를 만들 수 있다. 정의하자마자 실행되는 IIFE(즉시 호출되는 함수 표현식)로 사용될 수 있다. 함수 선언식과 달리 호이스팅 되지 않는다. (변수 이름만 호이스팅되고 함수의 정의는 호이스팅되지 않는다) 따라서 함수 표현식은 정의하기 전에는 사용할 수 없다. 함수 선언식 function name([params]) { [statements] } 함수 선언식은 선언을 둘러싼 함수의 최상부나 전역범위로 호이스팅된다. 화살표 함수 ([parmas]) => { statements } ([params]) => expression // { return expression; }과 .. 더보기

반응형