Left factorials: Difference between revisions
Content added Content deleted
m (→{{header|Sidef}}: minor code updates) |
|||
Line 3,208: | Line 3,208: | ||
=={{header|Sidef}}== |
=={{header|Sidef}}== |
||
Built-in: |
|||
<lang ruby>say 20.of { .left_factorial }</lang> |
|||
Straightforward: |
Straightforward: |
||
<lang ruby>func |
<lang ruby>func left_factorial(n) { |
||
^ |
^n -> sum { _! } |
||
}</lang> |
}</lang> |
||
Alternatively, using ''Range.reduce()'': |
|||
<lang ruby>func |
<lang ruby>func left_factorial(n) { |
||
^ |
^n -> reduce({ |a,b| a + b! }, 0) |
||
}</lang> |
}</lang> |
||
A |
A faster approach: |
||
<lang ruby>func |
<lang ruby>func left_factorial(n) { |
||
static cached = 0 |
static cached = 0 |
||
static factorial = 1 |
static factorial = 1 |
||
static leftfact = 0 |
static leftfact = 0 |
||
if (n < cached) { |
if (n < cached) { |
||
cached = 0 |
cached = 0 |
||
Line 3,229: | Line 3,232: | ||
leftfact = 0 |
leftfact = 0 |
||
} |
} |
||
while (n > cached) { |
while (n > cached) { |
||
leftfact += factorial |
leftfact += factorial |
||
factorial *= ++cached |
factorial *= ++cached |
||
} |
} |
||
leftfact |
leftfact |
||
}</lang> |
}</lang> |
||
Completing the task: |
Completing the task: |
||
<lang ruby>for |
<lang ruby>for n in (0..10, 20..110 `by` 10) { |
||
printf("!%d = %s\n", |
printf("!%d = %s\n", n, left_factorial(n)) |
||
} |
} |
||
for |
for n in (1000..10000 `by` 1000) { |
||
printf("!%d has %d digits.\n", |
printf("!%d has %d digits.\n", n, left_factorial(n).len) |
||
}</lang> |
}</lang> |
||