Fix and simplify recursion
This commit is contained in:
parent
b9fc858709
commit
b37a337e06
@ -12,22 +12,25 @@ def parse_args():
|
||||
'transform it into a'
|
||||
'palindrome'))
|
||||
parser.add_argument('-i',
|
||||
'--int',
|
||||
'--integer',
|
||||
required=True,
|
||||
help='The integer to be transformed.',
|
||||
type=int)
|
||||
# NOTE: The argument must be an integer. Because of this constrain integers
|
||||
# with leading zeroes will be stripped automatically in python 3.
|
||||
# with leading zeroes will be stripped automatically in python 3. Also the
|
||||
# script only allows integers as an input defined by type=int
|
||||
args = parser.parse_args()
|
||||
return args
|
||||
|
||||
|
||||
def main():
|
||||
args = parse_args()
|
||||
if args.int <= 10000 and args.int > 0:
|
||||
print('Input integer is: {}'.format(args.int))
|
||||
if args.integer <= 10000 and args.integer > 0:
|
||||
print('Input integer is: {}'.format(args.integer))
|
||||
transform = Transform()
|
||||
palindrome = transform.palindrome(args.int)
|
||||
palindrome = transform.palindrome(args.integer)
|
||||
if palindrome == transform.INVALID_RETURN_VALUE:
|
||||
print('Palindrome to be calculated is to big. Abort!')
|
||||
print("Final Output is:", palindrome)
|
||||
return palindrome
|
||||
else:
|
||||
|
@ -2,56 +2,57 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
class Transform(object):
|
||||
"""Class to transform a given integer into a palindrome"""
|
||||
# to avoid magic numbers.
|
||||
MAXIMUM_INPUT_VALUE = 1000000000
|
||||
INVALID_RETURN_VALUE = -1
|
||||
|
||||
def __init__(self):
|
||||
super(Transform, self).__init__()
|
||||
|
||||
def palindrome(self, int):
|
||||
def palindrome(self, integer):
|
||||
'''
|
||||
Kind of the main function. Checks if input int is already a palindrome
|
||||
and trys calculation one if input integer is not already a palindrome.
|
||||
The main function. Checks if input integer is already a palindrome
|
||||
and trys calculating one if input integer is not already a palindrome.
|
||||
'''
|
||||
self.input_int = int
|
||||
if self.__is_palindrome(self.input_int):
|
||||
print('Integer {} is a palindrome'.format(self.input_int))
|
||||
return self.input_int
|
||||
self.input_integer = integer
|
||||
if self.__is_palindrome(self.input_integer):
|
||||
print('Integer {} is a palindrome'.format(self.input_integer))
|
||||
return self.input_integer
|
||||
else:
|
||||
print('Integer {} is not a palindrome'.format(self.input_int))
|
||||
print('Calculating the palindrome for input {}'.format(self.input_int))
|
||||
print('Integer {} is not a palindrome'.format(self.input_integer))
|
||||
print('Calculating the palindrome for input {}'.format(self.input_integer))
|
||||
palindrome = self.__calculate_palindrome()
|
||||
return palindrome
|
||||
|
||||
# The following methods are private. Signaled by the leading __
|
||||
def __is_palindrome(self, int_to_check):
|
||||
reversed = self.__reverese_int(int_to_check)
|
||||
if self.input_int == reversed:
|
||||
reversed_integer = self.__reverese_int(int_to_check)
|
||||
if self.input_integer == reversed_integer:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def __reverese_int(self, int_to_reverse):
|
||||
reversed = 0
|
||||
reversed_integer = 0
|
||||
int_to_check = int_to_reverse
|
||||
while int_to_check > 0:
|
||||
reminder = int_to_check % 10
|
||||
reversed = (reversed * 10) + reminder
|
||||
reversed_integer = (reversed_integer * 10) + reminder
|
||||
int_to_check = int_to_check // 10
|
||||
return reversed
|
||||
return reversed_integer
|
||||
|
||||
def __calculate_palindrome(self):
|
||||
reversed = self.__reverese_int(self.input_int)
|
||||
self.input_int = self.input_int + reversed
|
||||
print('Possible palindrome is {}'.format(self.input_int))
|
||||
|
||||
if self.__is_palindrome(self.input_int) is True:
|
||||
return self.input_int
|
||||
|
||||
if self.__is_palindrome(self.input_int) is False:
|
||||
return self.__try_again()
|
||||
|
||||
def __try_again(self):
|
||||
while self.input_int <= 1000000000:
|
||||
self.__calculate_palindrome()
|
||||
if self.input_int >= 1000000000:
|
||||
print('Palindrome to be calculated is to big. Abort!')
|
||||
return -1
|
||||
reversed_integer = self.__reverese_int(self.input_integer)
|
||||
self.input_integer = self.input_integer + reversed_integer
|
||||
print('Possible palindrome is {}'.format(self.input_integer))
|
||||
if self.__is_palindrome(self.input_integer) is True:
|
||||
print('Possible palindrome is correct!')
|
||||
return self.input_integer
|
||||
elif not self.__is_palindrome(self.input_integer):
|
||||
print('Possible palindrome is wrong! Calcualte again!')
|
||||
while not self.__is_palindrome(self.input_integer):
|
||||
if self.input_integer >= self.MAXIMUM_INPUT_VALUE:
|
||||
return self.INVALID_RETURN_VALUE
|
||||
else:
|
||||
self.__calculate_palindrome()
|
||||
return self.input_integer
|
||||
|
Loading…
Reference in New Issue
Block a user