Python如何编写迭代函数
我正在查询一个数据库,想要获取一些参数,这些参数依赖于一个叫做 count
的属性!如果第一次查询没有返回任何结果,我可以增加 count
的值。下面是一个示例代码:
sls = {(213.243, 55.556): {}, (217.193, 55.793): {}, (213.403, 55.369): {}}
for key in sls.keys:
if not sls[key]:
ra, dec = key[0], key[1]
search_from_sourcelist(sl, ra,dec)
count = 1
def search_from_sourcelist(sl, ra,dec):
dist = count/3600.0
sls[(ra,dec)] = sl.sources.area_search(Area=(ra,dec,dist))
return
如果我运行 search_from_sourcelist
这个方法,但没有得到任何结果,我想增加 count
的值,然后再进行一次查询。这个过程要对字典中的所有键进行,直到所有的键都有值为止!!
3 个回答
递归是一种很有用的方法,当你能把一个大问题简化成一个“更小的版本”时,就可以用到它。
一个常见的例子就是阶乘函数。
def fac(n):
return n * fac(n-1) if n > 1 else 1
在这个例子中,你把计算n
的阶乘的问题,简化成计算n-1
的阶乘。
但是在你的代码里,并没有这种“简化”的过程。你只是增加一个值,然后又开始同样的问题。所以,我建议你用迭代的方法来解决这个问题。
我不太确定你是否真的需要用递归算法来解决这个问题。
如果我运行方法 search_from_sourcelist,但没有返回任何结果,我想增加计数,然后再执行查询
。这可以用一个循环来实现,像这样:
for key, value in sls.iteritems():
if not value:
ra, dec = key[0], key[1]
count = 1
while not search_from_sourcelist(sls, ra, dec):
count += 1
不过,如果你真的想用递归的方式来做这个,可以这样做,给我留言,我会帮你写出来。
另外,你应该检查一下你的 search_from_sourcelist
函数,因为它总是返回 None
。
这里是最基本的递归函数
def countdown(n):
if n == 0:
return "Blastoff"
else:
print "T minus %s" % n
return countdown(n-1)
你会注意到,countdown函数在返回时会调用自己,只不过参数变了,这里是n变成了n-1。所以如果你一直跟着这个过程走下去,你会看到
countdown(5) -> countdown(4) -> countdown(3) -> countdown(2) -> countdown(1) -> countdown(0) #stop
现在你明白了递归函数是什么样的,你会意识到你并没有真正返回自己函数的调用,因此你的代码并不是递归的。
我们使用递归是因为我们想把一个任务简化到最简单的形式,然后再从这个基础上开始处理。一个很好的例子就是麦块问题。所以你需要告诉我们你想要实现什么,以及如何将其变成一个更小的问题(更重要的是,为什么要这样做)。你确定不能用迭代的方式来解决这个问题吗?记住,你不想让你的栈深度过大,因为Python默认情况下并不是尾递归的。