個数だけ求めるなら、これで十分ですかね。
(define (iter-2 ans num rests) (if (null? rests) (if (check ans) 1 0) (if (not (check ans)) 0 (apply + (map (lambda (x) (iter-2 (append ans `(,x)) x (remove x rests))) rests))))) (define (iter num count) (if (> num n) count (iter (+ num 1) (+ count (iter-2 (cons num nil) num (remove num numbers))))))
apply の箇所の map は辞めたほうが良いかもですが、
いい加減深夜(4時過ぎ)で頭が回らないのでwwwwっw、
また今度直します。
gosh> (time (tonari 9 3)) ;(time (tonari 9 3)) ; real 0.000 ; user 0.000 ; sys 0.000 2 gosh> (time (tonari 10 3)) ;(time (tonari 10 3)) ; real 0.016 ; user 0.016 ; sys 0.000 40 gosh> (time (tonari 11 3)) ;(time (tonari 11 3)) ; real 0.125 ; user 0.156 ; sys 0.000 792 gosh> (time (tonari 12 3)) ;(time (tonari 12 3)) ; real 1.343 ; user 1.404 ; sys 0.063 15374 gosh> (time (tonari 13 3)) ;(time (tonari 13 3)) ; real 17.816 ; user 18.767 ; sys 1.419 281434 gosh> (time (tonari 14 3)) ;(time (tonari 14 3)) ; real 266.113 ; user 278.820 ; sys 14.961 5089060
n = 14 の解は求まりますが、かなり時間がかかります。
解の個数が約 20 倍になるのと、処理時間が約 10 倍になるのは予想通りです。
n = 15 は計算が終わるまで約1時間ぐらいかかりそうですw