要素をn回繰り替えしてリストを作る関数。

30分プログラム、その519。要素をn回繰り替えしてリストを作る関数。

同じ文字列のn回繰り返しを作る最速の方法を探求してみた - muddy brown thangに影響を受けて書き始めたら、全然違うところに行ってしまった。元ネタは"Javascriptで文字列の結合はどうするのが速い?"だったのに、Schemeで書いてるし、そもそも文字列の結合をしてない。まあ、これはこれで。

使い方

$ (repeat-1 3 "hoge")
("hoge" "hoge" "hoge")

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; hoge_x_n.scm -
;;
;; Copyright(C) 2009 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2009/01/31 20:03:42
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;
(use srfi-1)
(use srfi-13)
(use gauche.time)

;; 普通に再帰で実装する
(define (repeat-1 n str)
  (if (= n 0)
      '()
      (cons str
	    (repeat-1 (- n 1) str))))

;; 循環リストを使ってみる
(define (repeat-2 n str)
  (take (circular-list str)
	n))

;; 累乗計算のアルゴリズムを流用する
(define (repeat-3 n str)
  (cond
   ([= n 0] '())
   ([even? n]
    (let1 xs (repeat-3 (/ n 2) str)
      (append xs xs)))
   (else
    (cons str (repeat-3 (- n 1) str)))))

(define (bench f)
  (time (dotimes (i 100)
	  (f 100000 "hoge"))))