{"record":{"id":"821cbaf1eea8680c","repo":"TheAlgorithms/Python","slug":"dynamic-lucas-number-accepts-only-integer-argument","errorCode":null,"errorMessage":"dynamic_lucas_number accepts only integer arguments.","messagePattern":"dynamic_lucas_number accepts only integer arguments\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"maths/lucas_series.py","lineNumber":51,"sourceCode":"\ndef dynamic_lucas_number(n_th_number: int) -> int:\n    \"\"\"\n    Returns the nth lucas number\n    >>> dynamic_lucas_number(1)\n    1\n    >>> dynamic_lucas_number(20)\n    15127\n    >>> dynamic_lucas_number(0)\n    2\n    >>> dynamic_lucas_number(25)\n    167761\n    >>> dynamic_lucas_number(-1.5)\n    Traceback (most recent call last):\n        ...\n    TypeError: dynamic_lucas_number accepts only integer arguments.\n    \"\"\"\n    if not isinstance(n_th_number, int):\n        raise TypeError(\"dynamic_lucas_number accepts only integer arguments.\")\n    a, b = 2, 1\n    for _ in range(n_th_number):\n        a, b = b, a + b\n    return a\n\n\nif __name__ == \"__main__\":\n    from doctest import testmod\n\n    testmod()\n    n = int(input(\"Enter the number of terms in lucas series:\\n\").strip())\n    print(\"Using recursive function to calculate lucas series:\")\n    print(\" \".join(str(recursive_lucas_number(i)) for i in range(n)))\n    print(\"\\nUsing dynamic function to calculate lucas series:\")\n    print(\" \".join(str(dynamic_lucas_number(i)) for i in range(n)))\n","sourceCodeStart":33,"sourceCodeEnd":67,"githubUrl":"https://github.com/TheAlgorithms/Python/blob/f5988cc09713315817df6a7e327e258013a94440/maths/lucas_series.py#L33-L67","documentation":"Raised by dynamic_lucas_number in maths/lucas_series.py when n_th_number is not an int. The dynamic version iterates 'for _ in range(n_th_number)', and range() itself only accepts ints; the explicit isinstance guard gives a clearer error message (naming the function) than range's TypeError would. It computes L(n) by folding a, b = b, a + b starting from 2, 1.","triggerScenarios":"Calling dynamic_lucas_number(-1.5) or dynamic_lucas_number(3.0). The isinstance check fires immediately. Negative ints pass the guard and simply return 2 (range of a negative is empty), which may silently mask a bug.","commonSituations":"Float counters from progress calculations; reusing the same input across the recursive and dynamic variants and assuming identical validation; expecting negative indices to be rejected (they are not).","solutions":["Convert to int at the call site: dynamic_lucas_number(int(n)).","Additionally enforce n >= 0 yourself, since negative ints silently return 2.","Use this function instead of recursive_lucas_number for n above ~30 to avoid exponential runtime."],"exampleFix":"// before\nval = dynamic_lucas_number(count)  # count is 20.0\n\n// after\nval = dynamic_lucas_number(int(count)) if count >= 0 else None","handlingStrategy":"type-guard","validationCode":"n = int(n_th_number)\nif n < 0:\n    raise ValueError(f\"Lucas index must be >= 0, got {n}\")\nval = dynamic_lucas_number(n)","typeGuard":"def is_nonneg_int(v) -> bool:\n    return isinstance(v, int) and not isinstance(v, bool) and v >= 0","tryCatchPattern":"try:\n    val = dynamic_lucas_number(n)\nexcept TypeError:\n    val = dynamic_lucas_number(int(n))","preventionTips":["Convert float counters to int before calling","Add your own n >= 0 check: negative ints silently return 2 in this implementation"],"tags":["math","lucas","dynamic-programming","typeerror"],"backgroundTag":null,"analyzedSha":"f5988cc09713315817df6a7e327e258013a94440","analyzedAt":"2026-08-14T17:30:07.041Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}