開発環境
- OS X Lion - Apple(OS)
- Safari (Webプラウザ)
- TextWrangler(Text Editor) (BBEditの無料、light版)
- Script言語:JavaScript
- JavaScript Library: jQuery
『初めてのJavaScript 第2版』(シェリー・パワーズ著(Shelley Powers著)、武舎 広幸+武舎 るみ訳、オライリー・ジャパン、2009年、ISBN978-4-84312-225-5) の5章(JavaScriptの関数)練習問第5-1を解いてみる。
その他参考書籍
- JavaScript 第6版
- JavaScriptリファレンス 第6版
- 『jQueryクックブック』(jQuery Community Experts 著、株式会社クイープ 訳、オライリー・ジャパン、2010年、ISBN978-4-87312-268-2)
5-1.
コード(TextWrangler)
function calcFactorialRecursively(n){ if(n <= 1) return 1; return n * calcFactorialRecursively(n-1); } function calcFactorialWithLoop(n){ var result = 1; for(var i = n; i >= 2; i--){ result *= i; } return result; } var n = parseInt($('#t0').val()); var result = "再帰関数バージョン: " + n + "! = " + calcFactorialRecursively(n) + "\n" + "forループバージョン: " + n + "! = " + calcFactorialWithLoop(n) + "\n"; // メモ化 var fac = {}; function calcFactorialRecursively1(n){ if(fac) return fac[n]; if(n <= 1){ fac[1] = 1; return 1; } fac[n] = n * calcFactorialRecursively1(n-1); return fac[n]; } // メモ化ありと無しの時間を計測してみる // メモ化無し var c = parseInt($('#t1').val()); var now = new Date(); for(var i = 1; i <= c; i++){ calcFactorialRecursively(i); } var duration = (new Date() - now) / 1000; result += "メモ化無し: " + duration + "秒\n"; // メモ化有り now = new Date(); for(var i = 1; i <= c; i++){ calcFactorialRecursively1(i); } duration = (new Date() - now) / 1000; result += "メモ化有り: " + duration + "秒\n"; $('#pre0').text(result);
(注意: あまり大きい値を入力するとブラウザが固まる。)
再帰関数でメモ化っていうのに挑戦してみた。実際に速度も速くなったし、これであってるのかな。。
ちなみにPython3kの場合。
コード(TextWrangler)
sample.py
#!/usr/bin/env python3.3 #-*- coding: utf-8 -*- def calc_factorial_recursively(n): if n <= 1: return 1 return n * calc_factorial_recursively(n-1) def calc_factorial_with_loop(n): result = 1 for i in range(1, n+1): result *= i return result import re pattern = re.compile(r"^\s*$") while True: print("数値を入力: ", end="") str = input() if re.match(pattern, str): break n = int(str) print("再帰版: {0}! = {1}".format(n, calc_factorial_recursively(n))) print("forステートメント版: {0}! = {1}".format(n, calc_factorial_with_loop(n))) fac = {} def calc_factorial_recursively1(n): if n in fac: return fac[n] if n <= 1: fac[1] = 1 return fac[1] fac[n] = n * calc_factorial_recursively1(n-1) return fac[n] import time now = time.time() n = 500 for n in range(1, n): calc_factorial_recursively(n) print("メモ化無し: {0}秒".format(time.time() - now)) now = time.time() for n in range(1,n): calc_factorial_recursively1(n) print("メモ化: {0}秒".format(time.time() - now))
入出力結果(Terminal)
$ ./sample.py 数値を入力: 10 再帰版: 10! = 3628800 forステートメント版: 10! = 3628800 数値を入力: 1 再帰版: 1! = 1 forステートメント版: 1! = 1 数値を入力: 0 再帰版: 0! = 1 forステートメント版: 0! = 1 数値を入力: 11 再帰版: 11! = 39916800 forステートメント版: 11! = 39916800 数値を入力: メモ化無し: 0.06978893280029297秒 メモ化: 0.0007331371307373047秒 $
0 コメント:
コメントを投稿