-
-
Notifications
You must be signed in to change notification settings - Fork 51k
Expand file tree
/
Copy pathpell_number.py
More file actions
79 lines (65 loc) · 2.19 KB
/
Copy pathpell_number.py
File metadata and controls
79 lines (65 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
def pell_number_iterative(subscript: int) -> int:
"""
This function returns the `subscript`-th Pell number iteratively, where
`subscript` is a non-negative integer. Pell numbers are defined by the
recurrence relation:
P_0 = 0, P_1 = 1, P_n = 2 * P_(n-1) + P_(n-2)
https://en.wikipedia.org/wiki/Pell_number
https://oeis.org/A000129
>>> pell_number_iterative(0)
0
>>> pell_number_iterative(1)
1
>>> pell_number_iterative(12)
13860
>>> pell_number_iterative("1")
Traceback (most recent call last):
...
ValueError: The input must be an integer.
>>> pell_number_iterative(-1)
Traceback (most recent call last):
...
ValueError: The input number must be non-negative.
"""
if not isinstance(subscript, int):
raise ValueError("The input must be an integer.")
if subscript < 0:
raise ValueError("The input number must be non-negative.")
if subscript in (0, 1):
return subscript
prev_prev_num = 0
prev_num = 1
for _ in range(2, subscript + 1):
temp = 2 * prev_num + prev_prev_num
prev_prev_num = prev_num
prev_num = temp
return prev_num
def pell_number_recursive(subscript: int) -> int:
"""
This function calculates the `subscript`-th Pell number recursively. Due to
its recursive nature, this function grows exponentially with `subscript`.
For large values of `subscript`, use pell_number_iterative instead.
>>> pell_number_recursive(0)
0
>>> pell_number_recursive(1)
1
>>> pell_number_recursive(12)
13860
>>> pell_number_recursive("1")
Traceback (most recent call last):
...
ValueError: The input must be an integer.
>>> pell_number_recursive(-1)
Traceback (most recent call last):
...
ValueError: The input number must be non-negative.
"""
if not isinstance(subscript, int):
raise ValueError("The input must be an integer.")
if subscript < 0:
raise ValueError("The input number must be non-negative.")
if subscript in (0, 1):
return subscript
return 2 * pell_number_recursive(subscript - 1) + pell_number_recursive(
subscript - 2
)