Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的递归生成器_Python_Recursion_Generator_Bioinformatics - Fatal编程技术网

Python中的递归生成器

Python中的递归生成器,python,recursion,generator,bioinformatics,Python,Recursion,Generator,Bioinformatics,我编写了一个函数来返回一个生成器,其中包含给定长度的子字符串的每个唯一组合,这些子字符串包含主字符串中n个以上的元素 举个例子: 如果我有'abcdefghi'和长度为2的探针,并且每个列表的阈值为4个元素,我希望得到: ['ab', 'cd', 'ef', 'gh'] ['ab', 'de', 'fg', 'hi'] ['bc', 'de', 'fg', 'hi'] 我对这个问题的第一次尝试涉及返回一个列表列表。这导致计算机内存溢出。作为一个粗略的二次解决方案,我创建了一个生成器,它可以执行

我编写了一个函数来返回一个生成器,其中包含给定长度的子字符串的每个唯一组合,这些子字符串包含主字符串中n个以上的元素

举个例子:

如果我有'abcdefghi'和长度为2的探针,并且每个列表的阈值为4个元素,我希望得到:

['ab', 'cd', 'ef', 'gh']
['ab', 'de', 'fg', 'hi']
['bc', 'de', 'fg', 'hi']
我对这个问题的第一次尝试涉及返回一个列表列表。这导致计算机内存溢出。作为一个粗略的二次解决方案,我创建了一个生成器,它可以执行类似的操作。问题是,我创建了一个嵌套的生成器来调用自己。当我运行这个函数时,它似乎只是在内部for循环中循环,而实际上没有再次调用自己。我认为生成器将尽可能地位于递归孔的下方,直到它到达yield语句为止。有什么线索吗

def get_next_probe(self, current_probe_list, probes, unit_length):
    if isinstance(current_probe_list, list):
        last_probe=current_probe_list[-1]
        available_probes = [candidate for candidate in probes if candidate.start>last_probe.end]
    else:
        available_probes = [candidate for candidate in probes if candidate.start<unit_length]

    if available_probes:

        max_position=min([probe.end for probe in available_probes])
        available_probes2=[probe for probe in available_probes if max_position+1>probe.start]

        for new_last_probe in available_probes2:
            new_list=list(current_probe_list)
            new_list.append(new_last_probe)
            self.get_next_probe(new_list, probes, unit_length)

    else:
        if len(current_probe_list)>=self.num_units:
            yield current_probe_list
def get_next_探针(自身、当前探针列表、探针、单位长度):
如果存在(当前探头列表,列表):
上次探测=当前探测列表[-1]
available_probe=[如果候选,则探测中候选的候选.start>last_probe.end]
其他:
可用的_探测=[探测中的候选对象的候选对象if candidate.startprobe.start]
对于可用探头2中的新探头和最后探头:
新建探测列表=列表(当前探测列表)
新建\u列表。追加(新建\u上次\u探测)
self.get_next_探针(新探针列表、探针、单位长度)
其他:
如果len(当前探测列表)>=self.num\u单位:
产生电流探头列表
如果产量是改变印刷这作品刚刚好!如果能得到任何帮助,我将不胜感激。我意识到这不是这类搜索问题的最佳实现,它似乎从上一次调用get_next_probe返回一个已找到位置的列表,并过滤该列表中不与new_last_probe.end重叠的元素,这样会更有效。。。但这对我来说写起来容易多了。任何算法输入都将不胜感激

谢谢

我认为生成器将尽可能地位于递归孔的下方,直到它到达yield语句为止

它可以很好地递归,但是要获得向外传播的
yield
ed值,您需要显式地执行它-就像它是
返回
一样,您需要显式地
返回每个递归的结果。因此,不是:

 self.get_next_probe(new_list, probes, unit_length)
您可以执行以下操作:

 for val in self.get_next_probe(new_list, probes, unit_length):
     yield val
或者,如果您使用的是Python 3.3或更新版本,也可以执行以下操作:

yield from self.get_next_probe(new_list, probes, unit_length)

您似乎没有使用递归调用的结果。我希望看到一个内部循环,它在外部列表的子列表上迭代,将递归调用的结果连接起来,形成生成的结果。第一行ab缺少一个引号。从Python 3.2开始,您也可以只做
yield from self.get_next_prob(…)
@Dougal,
的收益率不在3.2版中,但在3.3版中会出现。很好的一点是@Ivc…在说这句话之前,你最好先检查一下,因为这些天我大部分代码都是在3.2版中写的。:)