Python 如何重新实现这个递归函数?
所以我试图解决一个难题,我遇到了这个代码。我不知道输出是什么,任何运行它的尝试都会导致“达到最大递归量”错误。对于那些愚蠢的变量名,我先表示歉意 如何修改它以获得相同的输出,而不出现递归错误?我传递的初始数字是13379446(arg1)和5(arg2)Python 如何重新实现这个递归函数?,python,recursion,Python,Recursion,所以我试图解决一个难题,我遇到了这个代码。我不知道输出是什么,任何运行它的尝试都会导致“达到最大递归量”错误。对于那些愚蠢的变量名,我先表示歉意 如何修改它以获得相同的输出,而不出现递归错误?我传递的初始数字是13379446(arg1)和5(arg2) 好的,我彻底检查了您的代码,以使用字典(values)和队列 import sys num1 = int(raw_input("num1: ")) num2 = int(raw_input("num2: ")) def doot(num1,
好的,我彻底检查了您的代码,以使用字典(
values
)和队列
import sys
num1 = int(raw_input("num1: "))
num2 = int(raw_input("num2: "))
def doot(num1, num2):
print num1
print num2
doritos = 0
n1 = num1
n2 = num2
values = {}
queue = [(num1,num2)]
while queue:
num1,num2 = queue.pop()
#print queue
#print values
if (num1,num2) not in values:
if num1 >= num2:
if num2 == 0:
#print "if"
#doritos = 1
values[(num1,num2)] = 1
else:
if num2 == num1:
#doritos = 1
values[(num1,num2)] = 1
else:
#wew = doot(num1 - 1, num2 - 1)
#doritos = wew
#wew = doot(num1 -1, num2)
#doritos = doritos + wew
if (num1-1,num2-1) in values and (num1-1,num2) in values:
values[(num1,num2)] = values[(num1-1,num2-1)] + values[(num1-1,num2)]
else:
queue.append((num1,num2))
if (num1-1,num2) not in values:
queue.append((num1-1,num2))
if (num1-1,num2-1) not in values:
queue.append((num1-1,num2-1))
#print values
doritos = values[(n1,n2)]
print doritos
return doritos
doot(num1,num2)
本质上,我使用队列来跟踪我还没有的总数。如果(num1,num2)
的两个后代都在字典中,那么我把它们的值和放在字典中。否则,我会将字典中未包含的子体之一或两个子体与其自身一起放在队列中。我没有将(num1,num2)
放回队列的其他时间是当num1==num2
或num2==0
时,在这种情况下,我将它们放在值为1的字典中。最后,我返回字典中与原始输入数字对应的值
现在,一句警告的话:这段代码效率极低。我刚刚不得不重新启动我的计算机,因为我尝试了你在问题中给出的输入,它吞噬了所有可用的RAM。因此,您应该考虑递归的具体操作,并找出如何从基本情况向前工作,而不是从输入向后工作。那项任务,我将留给你。让我开始吧。我假设
doritos
应该是返回值,也就是说,代码应该说returndortos
,而不是print doritos
。另外,我完全忽略了行print if
现在我们知道了什么?看看代码,我们看到了
doot(x,y) = 0 if y > x
doot(x,0) = 1
doot(x,x) = 1 and
doot(x,y) = doot(x-1,y-1) + doot(x-1,y) otherwise
所以我们想计算doot(x+h,x)的值,其中h>0。从最简单的情况开始,h=1。我们已经知道doot(1,0)=1,所以
现在很容易猜到
doot(x+1,x)=x+1 for all x>= 0.
如果你愿意的话,用归纳法也很容易证明这一点
现在,算出一些h=2的例子,算出doot(x+2,x)的公式。然后找出doot(x+3,x)的公式,依此类推,直到你准备猜测doot(x+h,x)的公式。你的代码是一个函数的递归实现,它计算从一组n个元素中可以提取的k个不同元素的组合数 一个整洁的函数版本看起来是这样的(注意,我已经删除了所有的print语句,并确保函数返回了一些东西,否则它将无法工作)
然而,计算13379446的阶乘仍然需要很长时间,并且可能不准确,因为结果太大了。我的系统在尝试时挂起。对于同一个问题,似乎效果更好。谜题是什么?输出应该是什么?这个函数是四个函数之一。我需要重新实现它,这样我就可以让它与其他函数一起运行。所有组合函数的输出将是我试图获取的标志。是的,但是预期的输出是什么?这是想干什么?在不知道的情况下,我只能建议您构建一个字典(在函数外部)来保存计算期间的值,因为这是递归深度问题的标准修复方法(如果这是您使用say
doot(3,1)运行时的唯一问题)
。我不知道除了数字之外,预期的输出应该是什么。挑战是在代码中跟踪一个值而不运行它。很抱歉,这不是非常有用。在上面的代码中,doot
不返回值。print doritos
应该是return doritos
吗?
doot(2,1) = doot(1,0)+doot(1,1) = 1+1 = 2
doot(3,2) = doot(2,1)+doot(2,2) = 2+1 = 3
doot(x+1,x)=x+1 for all x>= 0.
def doot(n, k):
if n < k:
return 0
if k == 0 or n == k:
return 1
return doot(n - 1, k - 1) + doot(n - 1, k)
import math
def nCr(n, r):
f = math.factorial
return f(n) / f(r) / f(n - r)