Jan-06-2020, 05:52 AM
def _factorial_sample_(n): if n == 0 or n == 1: return 1 else: result = n * _factorial_sample_(n-1) print("n is ", n, "*", result ) return result print(_factorial_sample_(10))
def _factorial_sample_(n): if n == 0 or n == 1: return 1 else: result = n * _factorial_sample_(n-1) print("n is ", n, "*", result ) return result print(_factorial_sample_(10))
def _factorial_sample_(n): if n == 0 or n == 1: return 1 else: #result = n * _factorial_sample_(n-1) print("\nGiven number to find factorial is ", n ,"\n") i=n fact=1 while(i>0): print( " ",fact," * ",i) fact=fact*i print("temp_computed_result= ",fact) i -= 1 print("\nfactorial of ",n," is : ", fact) return fact print(_factorial_sample_(5))
Output:python 6jan.py
Given number to find factorial is 5
1 * 5
temp_computed_result= 5
5 * 4
temp_computed_result= 20
20 * 3
temp_computed_result= 60
60 * 2
temp_computed_result= 120
120 * 1
temp_computed_result= 120
factorial of 5 is : 120
120
Best Regards,(Jan-07-2020, 05:52 AM)sbabu Wrote: [ -> ]I need to save the previous result and print it. So I can understand how the program is working.
[python]def _factorial_sample_(n): previous=0 if n == 0 or n ==1: return 1 else: result = n * _factorial_sample_(n-1) previous = result print (previous) print("n is ",n, "result",previous) return result print(_factorial_sample_(5))[/python]
Output:2
n is 2 result 2
6
n is 3 result 6
24
n is 4 result 24
120
I want to printdef _factorial_sample_(n): if n < 0: raise ValueError('No factorials for negative numbers') if n == 0 or n == 1: print(f'n is {n}, carrying over {1}, this is base case') return 1 else: result = n * _factorial_sample_(n-1) print(f'n is {n}, carrying over {result}') return resultWith different arguments one will get:
>>> _factorial_sample_(5) n is 1, carrying over 1, this is base case n is 2, carrying over 2 n is 3, carrying over 6 n is 4, carrying over 24 n is 5, carrying over 120 120 >>> _factorial_sample_(0) n is 0, carrying over 1, this is base case 1 >>> _factorial_sample_(1) n is 1, carrying over 1, this is base case 1 >>> _factorial_sample_(-5) /.../ ValueError: No factorials for negative numbersTo your original problem: you probably should use memoization
def factorial(n, d={0:1, 1:1}): if n < 0: raise ValueError('No factorials for negative numbers!') if n in d: print(f'n is {n}, carry over {d[n]}, this is base case') return d[n] else: value = factorial(n-1, d) * n d[n] = value print(f'n is {n}, carry over {n} * {d[n-1]} = {d[n]}') return valueThis gives:
>>> factorial(5) n is 1, carry over 1, this is base case n is 2, carry over 2 * 1 = 2 n is 3, carry over 3 * 2 = 6 n is 4, carry over 4 * 6 = 24 n is 5, carry over 5 * 24 = 120 120 >>> factorial(0) n is 0, carry over 1, this is base case 1 >>> factorial(-5) /.../ ValueError: No factorials for negative numbers! # But! Second time in same session: >>> factorial(5) n is 5, carry over 120, this is base case 120 >>> factorial(6) n is 5, carry over 120, this is base case n is 6, carry over 6 * 120 = 720 720
def _factorial_sample_(n,output): if n == 0 or n == 1: output.append(1) return n,output else: x, output = _factorial_sample_(n-1,output) new_val = x * output[-1] output.append(new_val) print(output) return n,output print(_factorial_sample_(6,[]))
Output:[1, 1]
[1, 1, 2]
[1, 1, 2, 6]
[1, 1, 2, 6, 24]
[1, 1, 2, 6, 24, 120]
(6, [1, 1, 2, 6, 24, 120])
(Jan-08-2020, 12:25 PM)perfringo Wrote: [ -> ]As I told - one way is to use memoization. It seems to me that if you are 'told' then it's homework therefore I provide a solution which has caveats and may not pass automated test system:
def factorial(n, d={0:1, 1:1}): if n < 0: raise ValueError('No factorials for negative numbers!') if n in d: print(f'n is {n}, carry over {d[n]}, this is base case') return d[n] else: value = factorial(n-1, d) * n d[n] = value print(f'n is {n}, carry over {n} * {d[n-1]} = {d[n]}') return valueThis gives:
>>> factorial(5) n is 1, carry over 1, this is base case n is 2, carry over 2 * 1 = 2 n is 3, carry over 3 * 2 = 6 n is 4, carry over 4 * 6 = 24 n is 5, carry over 5 * 24 = 120 120 >>> factorial(0) n is 0, carry over 1, this is base case 1 >>> factorial(-5) /.../ ValueError: No factorials for negative numbers! # But! Second time in same session: >>> factorial(5) n is 5, carry over 120, this is base case 120 >>> factorial(6) n is 5, carry over 120, this is base case n is 6, carry over 6 * 120 = 720 720