Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -726,6 +726,7 @@
* [Continued Fraction](maths/continued_fraction.py)
* [Decimal Isolate](maths/decimal_isolate.py)
* [Decimal To Fraction](maths/decimal_to_fraction.py)
* [Derangement](maths/derangement.py)
* [Dodecahedron](maths/dodecahedron.py)
* [Double Factorial](maths/double_factorial.py)
* [Dual Number Automatic Differentiation](maths/dual_number_automatic_differentiation.py)
Expand Down Expand Up @@ -876,6 +877,7 @@
* [Two Pointer](maths/two_pointer.py)
* [Two Sum](maths/two_sum.py)
* [Volume](maths/volume.py)
* [Weighted Average](maths/weighted_average.py)
* [Zellers Congruence](maths/zellers_congruence.py)

## [Matrix](matrix)
Expand Down
42 changes: 42 additions & 0 deletions maths/derangement.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""
A Python implementation for finding number of
derangements possible for k objects
https://en.wikipedia.org/wiki/Derangement
"""


def derangement(objects: int) -> int:
"""
Calculates the number of derangements of k objects.
:param objects:the number of objects ( -1 < objects < 1560 )
:return :the number of derangements
:raises :ValueError: If objects is negative.

Examples:
>>> derangement(3)
2
>>> derangement(5)
44
>>> derangement(10)
1334961
"""
if objects < 0:
raise ValueError("k must be a non-negative integer. Retry")

# Base cases
if objects in (0, 1):
return 0

# Initialize the derangement counts
derange_1 = 1
derange_2 = 0
answer = 1

# Calculate derangements using dynamic programming
# Answer: F(n) = (n - 1) * ( F(n - 1) + F(n - 2) )
for i in range(3, objects + 1):
answer = (i - 1) * (derange_1 + derange_2)
derange_2 = derange_1
derange_1 = answer

return answer
Loading