원본 주소: http://www.davidflanagan.com/2009/08/string-multipli.html
원저자: David Flanagan
In Ruby 에서 "*" 연산자는 문자열을 왼쪽 매개변수로 사용하고 숫자를 오른쪽 매개변수로 사용하여 문자열 반복을 구현합니다. 예를 들어, "Ruby" * 2의 값은 "RubyRuby"입니다. 이는 몇 가지 위치(예: 하이픈과 같은 ASCII 문자 테이블 생성)에서만 유용하지만 매우 간결합니다. 그리고 문자열을 n번 연결하는 루프를 작성하는 것보다 낫습니다. 이는 매우 비효율적으로 보입니다.
방금 JavaScript에서 문자열 곱셈을 수행하는 영리한 방법을 발견했습니다.
String.prototype.times = function(n) {
return Array.prototype.join.call({length:n 1}, this); ;
"js".times(5) // => "jsjsjsjs"
이 메소드는 요소가 모두 "정의되지 않은" 배열을 호출하는 것입니다. 행동. 그러나 실제로 n 1개의 "정의되지 않은" 요소가 있는 배열을 생성하지는 않습니다. 이는 Array 객체의 프로토타입 함수인 Join()에 의존하여 길이 속성을 포함하는 익명 객체를 사용합니다. "Object"는 배열이 아니기 때문에 Join()을 직접 호출할 수 없으므로 프로토타입의 call()을 통해 구현해야 합니다. 동일한 효과를 갖는 간단한 버전은 다음과 같습니다.
String.prototype.times = function(n) { return (new Array(n 1)).join(this);}
Array의 생성자를 호출할 때 매개변수는 배열의 길이를 설정하기만 하고 배열의 요소를 실제로 생성하지는 않습니다.
Firefox에서만 테스트했고 일반 루프보다 더 효율적일 것으로 예상하지만 벤치마킹하지는 않았습니다.
저자 소개
David Flanagan은 Java 글쓰기에 푹 빠진 컴퓨터 프로그래머입니다. 그는 대부분의 시간을 Java 관련 책을 쓰는 데 보냅니다. David는 MIT에서 컴퓨터 과학 및 엔지니어링 학위를 받았습니다. 그는 시애틀과 밴쿠버 사이의 미국 태평양 북서부 해안에 살고 있습니다. 그의 베스트셀러 O'Reilly 저서로는 Java in a Nutshell, Java Foundation Classes in a Nutshell, Java Enterprise in a Nutshell, JavaScript: The Definitive Guide, JavaScript Pocket Reference 및 The Ruby 프로그래밍 언어 등이 있습니다.
내 의견
효율성이 중요하다면 루프 반복을 약간 최적화하는 것이 더 효율적일 수 있습니다. 예를 들어, 다음 재귀 호출의 알고리즘 복잡도는 O(log2n)입니다. Google Chrome에서의 테스트 결과는 David의 방법보다 빠르게 실행된다는 것입니다. 그러나 그의 방법이 매우 우아하다는 점은 인정해야 합니다!
String.prototype.times = function(n ) {
if (n == 1 ) {
return this;
}
var midRes = this.times(Math.floor(n/2))
midRes = midRes;
if ( n % 2 ) {
midRes = this;
}
return midRes;
}
Postscript
David가 내 제안을 채택했습니다. 그는 우리를 위해 비재귀 버전을 작성했습니다. 그의 블로그의 원본 텍스트를 참조하십시오: http://www.davidflanagan.com/2009/08/good-algorithms.html
연락처 정보
내 이메일, 저에게 연락을 환영합니다(redraiment@gmail.com). )