#:g1: QiでL-99 (P23 ランダムに指定した個数の要素を選択)

Posted 2008-04-07 20:07:00 GMT

-(http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)
今迄なんとなくQiっぽくなくなるかなと思ってあまりifを使ってきませんでしたが、Qiにもifはあります。
今回は、whereだけでは、lengthを2回呼ぶことになるのでifを使ってみました。

(rnd-select [a b c d e f g h] 3)  
\=> [g c e]
\

(define rnd-select [ ] _ -> [ ] Lst N -> (let Len (length Lst) (if (> N Len) [ ] (rnd-select* Lst N [ ] Len))))

(define rnd-select* [ ] _ Acc _ -> Acc Lst N Acc Len -> Acc where (>= 0 N) Lst N Acc Len -> (let Pos (+ 1 (random Len)) (rnd-select* (remove-at Lst Pos) (- N 1) [(nth Pos Lst) | Acc] (- Len 1))))


comments powered by Disqus