在Python中使用递归将一个数字写为1和2的数组,其和等于该数字 PG>解决方案后,除了C++和java之外,我在网上找不到任何替代方案。
我看到了关于给定元素数组的问题,尽管在我的例子中没有预定义的数组。程序应该自己创建它 问题: 我需要知道1和2的多少个组合加起来就是输入数在Python中使用递归将一个数字写为1和2的数组,其和等于该数字 PG>解决方案后,除了C++和java之外,我在网上找不到任何替代方案。,python,arrays,algorithm,python-2.7,recursion,Python,Arrays,Algorithm,Python 2.7,Recursion,我看到了关于给定元素数组的问题,尽管在我的例子中没有预定义的数组。程序应该自己创建它 问题: 我需要知道1和2的多少个组合加起来就是输入数 INPUT OUTPUT 1 1 3 3 5 8 如何解决它? 程序应将输入编号转换为数组(数组表示N=1),数组中的元素总和为输入编号。然后它应该计算数组(组合)的数量 为了清晰起见 N=1(1个组合) N=2(2种组合) N=3(3种组合) N=4(5种组合) 等等。递归解有两部分。它们有一个基本
INPUT OUTPUT
1 1
3 3
5 8
如何解决它?
程序应将输入编号转换为数组(数组表示N=1),数组中的元素总和为输入编号。然后它应该计算数组(组合)的数量
为了清晰起见
N=1(1个组合)
N=2(2种组合)
N=3(3种组合)
N=4(5种组合)
等等。递归解有两部分。它们有一个基本情况,或者一个最简单的情况,它们有一个“递归”情况,或者一个通过首先解决一个更简单形式的问题来解决的情况 在这个问题中,最简单的情况是什么?您将如何解决它 如何减少问题,并在减少的问题上递归使用此解决方案,然后解决原始问题 例如,这里是阶乘的递归定义:
def factorial(n):
if n <= 0:
return 1
else:
return factorial(n-1) * n
def阶乘(n):
如果n只是一个例子,这可能会有所帮助
def get_arays(n):
divs = [i for i in xrange(1, n/2 + 1) if not n % i] # get divisors
for i in divs:
print [i]*(n/i)
get_arays(100)
除名
使用尾部递归将堆栈减少到O(1)
空间:
def fib(n):
if n in [0,1]:
return 1
return _f(1, 1, n)
def _fib(a, b, i):
if i == 1:
return a
return _f(a+b, a, i-1)
print(fib(4)) # 5
我最近贴了一个类似的问题,但这是一个教科书问题的复制和粘贴。我向社区成员道歉。@ StPrFruuCH,如果只有可能的值是1和2,我认为没有3位数的情况。你说你找到了C++和java的例子吗?你知道它们是怎么工作的吗?@stephernauch一位数的大小写只存在于N=1的情况下。否则,将有两个或多个数组。我没有遗漏案例,任何数组中只能出现1和2。您需要创建“一个”数组,其中谁的和是给定的数字,还是“所有”数组中谁的和是给定的数字?此解决方案有两个问题:1。它会引发错误,因为您正在main()函数2中传递n的字符串。如果您解析该n=int(input())并使用n=100运行它,您的解决方案将永远运行。这是因为解决方案的时间复杂度为O(2^n)
[1, 1, 1, 1]
[2, 1, 1]
[1, 2, 1]
[1, 1, 2]
[2, 2]
def factorial(n):
if n <= 0:
return 1
else:
return factorial(n-1) * n
def combination(n):
if n == 0 or n == 1:
return 1
else:
return combination(n-1) + combination(n-2)
def main():
n = input()
print(combination(n))
if __name__ == '__main__':
main()
def get_arays(n):
divs = [i for i in xrange(1, n/2 + 1) if not n % i] # get divisors
for i in divs:
print [i]*(n/i)
get_arays(100)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
[20, 20, 20, 20, 20]
[25, 25, 25, 25]
[50, 50]
def fib(n):
if n in [0,1]:
return 1
return _f(1, 1, n)
def _fib(a, b, i):
if i == 1:
return a
return _f(a+b, a, i-1)
print(fib(4)) # 5