Problem-12

python

Question

This problem was asked by Amazon. There exists a staircase with N steps, and you can climb up either 1 or 2 steps at a time. Given N, write a function that returns the number of unique ways you can climb the staircase. The order of the steps matters. For example, if N is 4, then there are 5 unique ways: 1, 1, 1, 1 2, 1, 1 1, 2, 1 1, 1, 2 2, 2 What if, instead of being able to climb 1 or 2 steps at a time, you could climb any number from a set of positive integers X? For example, if X = {1, 3, 5}, you could climb 1, 3, or 5 steps at a time.

                    
							

def static_vars(**kwargs):
    def decorate(func):
        for k in kwargs:
            setattr(func, k, kwargs[k])
        return func
    return decorate

@static_vars(count=0)
def calculate(steps,patterns,level=0,reset=0,verbose=False):
	if(reset == 1):
		calculate.count = 0
	for pattern in patterns:
		new_step = steps-pattern
		if(new_step < 0):
			break
		if(new_step == 0):
			calculate.count += 1
		if(verbose):
			print("{}At step {}, took {} steps, new step = {}".format("\t"*level,steps, pattern,new_step))	
		calculate(new_step,patterns,level+1)
	return ("{} ways to climb {} steps with {} step-lengths.\n".format(calculate.count,steps,patterns))

steps = [4,5]
patterns = [[1],[1,2],[1,3,5]]
for step in steps:
	for pattern in patterns:
		print(calculate(step,pattern,reset=1,verbose=False)) # Verbose false will print the search in a tree-like manner