再帰Rangeをメモ化する

  • 前回のfibonacciは20番目くらいでシステムに支障を来たしてしまうほど遅い
  • メモ化するといい
  • メモ化の実装であるmulti_passは、デフォルトで、メモ用のコンテナに参照カウントを使うのだが、見てのとおり循環参照が起きてリークする
  • first_ownerというポリシークラスがちゃんと用意されていた
  • これで一瞬で終わるようになった (実装)

[]typedef[] []any_range[][]< [][]int[][], [][]recursive[][]<> > [][]range_t[][];[]

[]memo_table[] []to_table[][];[]
[]range_t[] []fibs[][];[]
[]int[] []const[] []start[][][] = { [][]1[][], [][]1[][] };[]
[]fibs[][] =[]
[]start[][]|[][]transformed[][]([][]pstade[][]::[][]as_value[][])|[]
[]jointed[][]([]
[]boost[][]::[][]make_tuple[][]([][]recursion[][]([][]fibs[][]), [][]recursion[][]([][]fibs[][])|[][]dropped[][]([][]1[][]))|[]
[]zipped_with[][]([][]regular[][]([][]lambda[][]::[][]_1[][] + [][]lambda[][]::[][]_2[][]))[]
[] )[]
[] | [][]memoized[][]([][]to_table[][])[]
[];[]

[]std[][]::[][]cout[][] << ([][]fibs[][]|[][]taken[][]([][]30[][]));[]