1 | ### choose =====================================================================
|
2 |
|
3 | Tags
|
4 | ----
|
5 | scripting, JS, internal, treenode, general concept
|
6 |
|
7 | Parameters
|
8 | ----------
|
9 | n,k
|
10 |
|
11 | General description
|
12 | -------------------
|
13 |
|
14 | Returns the number of combinations of n items taken k at a time.
|
15 |
|
16 | For example, the number of five card hands is choose(52,5)
|
17 |
|
18 | ```
|
19 | n!
|
20 | choose(n,k) = -------------
|
21 | k! (n - k)!
|
22 | ```
|
23 | ###
|
24 |
|
25 |
|
26 | Eval_choose = ->
|
27 | push(cadr(p1))
|
28 | Eval()
|
29 | push(caddr(p1))
|
30 | Eval()
|
31 | choose()
|
32 |
|
33 | # Result vanishes for k < 0 or k > n. (A=B, p. 19)
|
34 |
|
35 | #define N p1
|
36 | #define K p2
|
37 |
|
38 | choose = ->
|
39 | save()
|
40 |
|
41 | p2 = pop()
|
42 | p1 = pop()
|
43 |
|
44 | if (choose_check_args() == 0)
|
45 | push_integer(0)
|
46 | restore()
|
47 | return
|
48 |
|
49 | push(p1)
|
50 | factorial()
|
51 |
|
52 | push(p2)
|
53 | factorial()
|
54 |
|
55 | divide()
|
56 |
|
57 | push(p1)
|
58 | push(p2)
|
59 | subtract()
|
60 | factorial()
|
61 |
|
62 | divide()
|
63 |
|
64 | restore()
|
65 |
|
66 | choose_check_args = ->
|
67 | if (isnum(p1) && lessp(p1, zero))
|
68 | return 0
|
69 | else if (isnum(p2) && lessp(p2, zero))
|
70 | return 0
|
71 | else if (isnum(p1) && isnum(p2) && lessp(p1, p2))
|
72 | return 0
|
73 | else
|
74 | return 1
|
75 |
|
76 |
|