Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixed error in factorial.py #1888

Merged
merged 5 commits into from
Aug 5, 2020
Merged

Conversation

SandersLin
Copy link
Contributor

@SandersLin SandersLin commented Apr 17, 2020

Describe your change:

factorial(11) returns index out of range. To implement memoization an auxiliary function is required.

  • Add an algorithm?
  • Fix a bug or typo in an existing algorithm?
  • Documentation change?

Checklist:

  • I have read CONTRIBUTING.md.
  • This pull request is all my own work -- I have not plagiarized.
  • I know that pull requests will not be merged if they fail the automated tests.
  • This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms.
  • All new Python files are placed inside an existing directory.
  • All filenames are in all lowercase characters with no spaces or dashes.
  • All functions and variable names follow Python naming conventions.
  • All function parameters and return values are annotated with Python type hints.
  • All functions have doctests that pass the automated testing.
  • All new algorithms have a URL in its comments that points to Wikipedia or other similar explanation.
  • If this pull request resolves one or more open issues then the commit message contains Fixes: #{$ISSUE_NO}.

Copy link

@wandrewp wandrewp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommend making factorial_aux a private function since no outside entity need use it.

Recommend putting the debug statements back in showing where to print result for debugging, although I noticed debugging it in that fashion causes docttest to print out a lot of example failed blocks.

Otherwise I think this change is good and it makes sense.

@TravisBuddy
Copy link

Hey @SandersLin,
Something went wrong with the build.

TravisCI finished with status errored, which means the build failed because of something unrelated to the tests, such as a problem with a dependency or the build process itself.

View build log

TravisBuddy Request Identifier: 09604660-b535-11ea-aae7-0b05fcc524af

@ashishpawar517
Copy link

we can use math.factorial if required .

return factorial_aux(num, result)


def factorial_aux(num, result):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Type hints? Doctests?

Copy link

@ashishpawar517 ashishpawar517 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Its working .!

result[num] = num * factorial(num - 1)
# uncomment the following to see how recalculations are avoided
# print(result)
result[num] = num * factorial_aux(num - 1, result)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Technically, this is more of a "memoization" approach. While being perfectly correct, the more appropriate algorithm for this section may look as follows

Suggested change
result[num] = num * factorial_aux(num - 1, result)
result[0] = 1
for i in xrange(num):
result.append((i + 1) * result[i])
return result[num]

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

xrange() was removed from Python on 1/1/2020.

The canonical way to do memoization in Python is with the lru_cache function decorator.

@TravisBuddy
Copy link

Hey @SandersLin,
Something went wrong with the build.

TravisCI finished with status errored, which means the build failed because of something unrelated to the tests, such as a problem with a dependency or the build process itself.

View build log

TravisBuddy Request Identifier: aabb4010-d708-11ea-85fc-4b61cecd2c91

@cclauss cclauss merged commit f0d7879 into TheAlgorithms:master Aug 5, 2020
stokhos pushed a commit to stokhos/Python that referenced this pull request Jan 3, 2021
* Update factorial.py

* updating DIRECTORY.md

* Update dynamic_programming/factorial.py

* Update factorial.py

Co-authored-by: mateuszz0000 <mtszzwdzk@gmail.com>
Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
Co-authored-by: Christian Clauss <cclauss@me.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants