【问题标题】:Output gets erased in a recursive function输出在递归函数中被擦除
【发布时间】:2015-04-29 17:07:57
【问题描述】:

我基本上在下面的python中创建了这个递归函数,它计算从另一个节点到另一个节点的功率,并根据节点的覆盖半径找到。

我想要做的是从这个函数中获取输出并再次调用它的递归函数,而不会丢失我得到的输出,我不知道该怎么做。

这是下面的函数:

def find_new_int(node_in_ex, old_inters):
    global Power_Sensitivity
    global copy_of_int_list
    intersection_list_method = []
    for wall_coordinates in lines:
        if intersection_rand_point(wall_coordinates[0], wall_coordinates[1], node_in_ex-1, old_inters) is not False:
            intersection_list_method.append(intersection_rand_point(wall_coordinates[0], wall_coordinates[1], node_in_ex-1, old_inters))
    intersection_list_method = sorted(list(itertools.chain(*intersection_list_method)), key=cal_distance_av)
    for points in intersection_list_method:
        if cal_pow_rec_plndwall(node_in_ex, points) > Power_Sensitivity:
            return intersection_list_method
    for points in intersection_list_method:
        return find_new_int(node_in_ex, points)

我想循环第一次运行函数时输出的intersection_list_method >>IF

find_new_int(node_in_ex, points)

再次,我正在循环的intersection_list_method 被删除并创建了一个新的,但我想在该列表中的每个点上循环,并查看该函数是否会为intersection_list_method 中的每个点返回该列表,直到它结束

有什么帮助吗?

【问题讨论】:

  • 第一个明显的问题是for points in intersection_list_method: return find_new_int(node_in_ex, points) 会在你获得第一个值后立即转到return,这意味着你永远不会执行循环的其余部分。 (这是你唯一的递归调用,所以大概是你遇到问题的那个。)这两行 supposed 是做什么的?
  • @abarnert 所以我必须找到我从方法中得到的半径节点之间的交点:intersection_rand_point(wall_coordinates[0], wall_coordinates[1], node_in_ex-1, old_inters) 然后我返回具有计算半径的墙与墙周围墙的交点列表。我的问题是,例如,如果从另一个节点到达的交叉点功率的第一个点是
  • 嗯,是的,它停在第一个节点,因为你return 为每个节点一次,一旦你return 为第一个节点,这就是函数的结尾。如果您需要为每个节点做某事并以某种方式汇总所有这些调用的结果,您需要解释那是什么。例如,如果您只想返回它们的列表,您可以在循环中将 append 放到该列表中,然后在循环完成后将 return 放到列表中。
  • 不,我的问题有所不同。我希望它在我发现的第一个节点停止,该节点有一个交叉点列表,该列表中有一个交叉点,其功率大于原始节点。这就是我在这里所做的:`对于intersection_list_method中的点:如果cal_pow_rec_plndwall(node_in_ex,points)> Power_Sensitivity:返回intersection_list_method`但是如果它没有在那个列表中找到一个功率>功率灵敏度的点,我希望它再次调用相同的再次在该列表中的每个点上运行,直到它返回一些东西。
  • 好的,那么你只需要在循环内有一个if 来检查返回值,并且只有当它是“某物”时才返回它。让我试着在答案中解释一下。

标签: python recursion


【解决方案1】:

您的代码会这样做:

for points in intersection_list_method:
    return find_new_int(node_in_ex, points)

但你想要的是:

但是,如果它在那个列表中没有找到一个点,我希望它再次在那个列表中的每个点上再次调用相同的函数,直到它返回一些东西。

假设“returns something”的反义词是“returns None”,则如下所示:

for points in intersection_list_method:
    result = find_new_int(node_in_ex, points)
    if result is not None:
        return result

【讨论】:

  • 但是如果函数没有返回什么是它 None 作为输出?
  • 希望发生这种情况,你是绝对正确的,但我想稍微调整一下你刚刚写的内容,如果它完成了这个列表:`intersection_list_method' 而不返回结果,也返回 None 也得到从每个点输出的列表并在它们上循环并做同样的事情,直到它返回一个不是无的结果。就像一个递归方法。
  • @MahmoudAyman:如果你在没有return 语句的情况下从函数末尾掉下来,是的,返回值是None。你当然没有必须在这里使用None;你只需要有某种方式从“我没有什么要归还”中发出“我有东西要归还,这就是它是什么”的信号。但是,只要 None 不是有效的“要返回的东西”,默认的 None 返回是一种方便的方法。
  • @MahmoudAyman:我不太明白你的第二条评论。看起来你在问如何完全按照我的解释做,并在答案中展示了如何做。答案是在每个points 上循环,递归调用该函数,直到它返回一个不是None 的结果。如果这就是你想要的,那就去做吧。
  • 我说的是如果结果继续输出 None 那么循环将遍历 intersection_list_method 中的每个点直到它结束,结果仍然是 None。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多