Python如何编写迭代函数

1 投票
3 回答
15712 浏览
提问于 2025-04-16 20:27

我正在查询一个数据库,想要获取一些参数,这些参数依赖于一个叫做 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 个回答

1

递归是一种很有用的方法,当你能把一个大问题简化成一个“更小的版本”时,就可以用到它。

一个常见的例子就是阶乘函数。

def fac(n):
    return n * fac(n-1) if n > 1 else 1

在这个例子中,你把计算n的阶乘的问题,简化成计算n-1的阶乘。

但是在你的代码里,并没有这种“简化”的过程。你只是增加一个值,然后又开始同样的问题。所以,我建议你用迭代的方法来解决这个问题。

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

4

这里是最基本的递归函数

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默认情况下并不是尾递归的。

撰写回答