Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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_Function_Recursion_Python 3.4 - Fatal编程技术网

Python 递归函数故障

Python 递归函数故障,python,function,recursion,python-3.4,Python,Function,Recursion,Python 3.4,我正在尝试创建一个递归函数,例如,我的函数包含3个字符串str1、str2和str3。例如,str1=“abc”、str2=“def”和str3=“dabecf”是一个有效的混洗,因为str3具有str1和str2的所有字符 递归函数真的把我弄糊涂了,我不知道该怎么做。我试过了 def foo(str1,str2,str3): for x in combinations(str1,len(str1)): for t in combinations(str2,len(str

我正在尝试创建一个递归函数,例如,我的函数包含3个字符串<代码>str1、str2和str3。例如,
str1=“abc”、str2=“def”和str3=“dabecf”
是一个有效的混洗,因为
str3
具有str1和str2的所有字符

递归函数真的把我弄糊涂了,我不知道该怎么做。我试过了

def foo(str1,str2,str3):
    for x in combinations(str1,len(str1)):
        for t in combinations(str2,len(str2)):
            if x in tuple(str3) and t in tuple(str3):
                return True

但这是错误的。如何实现我的目标?

DISCLAMER:我不是python开发人员,但我想为您的问题提供一种新的解决方法

也许你可以这样做

if any(str1 in str3) and any(str2 in str3):
    return True

我可以尝试提出另一种解决方案:

from itertools import chain,imap

def is_shuffle(st1,str2,str3):
    return reduce(lambda a,b: a and b, imap(lambda s: s in str3, chain(str1,str2)))
(假设“由于str3具有str1和str2的所有字符,因此洗牌有效。”这意味着我们只检查str1或str2中的每个字符是否都在str3中)

你可以看到这是正确的。 但是,您可以继续使用常规的
映射
(如果您使用的是Python3.x,它无论如何都是迭代的),只使用
+
字符串来避免
itertools
,但我更喜欢迭代方法


关于递归部分,目前编写的代码不是递归的,因为它不调用自身,幸运的是,在这种情况下不需要它。

使用set查看大字符串是否包含小字符串的每个字符:

>>> set_a = set('abc')
>>> set_b = set('def')
>>> set_c = set('dabecf')
>>> (set_a & set_c == set_a) and (set_b & set_c == set_b)
True
它对我有用

def s3_has_all(str1, str2, str3):
  set_a = set(str1)
  set_b = set(str2)
  set_c = set(str3)
  return (set_a & set_c == set_a) and (set_b & set_c == set_b)

print s3_has_all('aaaa','abababab','ab')
我不明白为什么不行

F:\so>python tst.py
True

我可以猜你正在学习递归函数吗?如果这是真的,下面是一个例子:

def is_valid_shuffle(str1, str2, str3):

    # --1--
    # str3 is empty, so by definition, is_valid_shuffle is true
    if not str3:
        return True

    # --2--
    # Check for the presence of str3[0] in str1
    i1 = str1.find(str3[0])
    if i1 > -1:
        return is_valid_shuffle(str1[:i1] + str1[i1+1:], str2, str3[1:])

    # same as above but for str2
    i2 = str2.find(str3[0])
    if i2 > -1:
        return is_valid_shuffle(str1, str2[:i2] + str2[i2+1:], str3[1:])

    # --3--
    return false;
  • 首先,为了得到一个递归函数,首先需要一个调用自身的函数
  • 然后,您应该有一些方法来终止递归。这里,这就是块--1--和--3--的用途。如果str3为空,则第一个将返回true;如果str3[0]与str1和str2中的字符都不匹配,则块3将返回false
  • 递归部分包含在块--2--中。这些函数将检查str3的第一个字符是否在其他两个字符串中的一个字符串中,如果这是真的,则调用同一个函数,但要稍微修改参数

请注意,这在Python中并不是很有效——但在某些有所谓的语言中,这可能与循环一样有效。

我知道您想了解递归。OTOH,Python中不鼓励递归:正如前面提到的,Python没有递归,并且递归的深度有一个限制(尽管可以根据需要进行调整)

解决特定问题的简单方法是对字符串进行排序,然后进行比较。例如

#! /usr/bin/env python

def is_valid_shuffle(dest, *sources):
    return sorted(dest) == sorted(''.join(sources))

print is_valid_shuffle("dabecf", "abc", "def")
print is_valid_shuffle("dabecf", "fe", "db", "ac")
print is_valid_shuffle("dabecf", "fedcba")
print is_valid_shuffle("dabecf", "fedcb", "ba")
print is_valid_shuffle("aaa", "a", "a", "a")

**output**

True
True
True
False
False

如您所见,您可以将任意数量的源字符串传递给此函数,并根据目标字符串对其进行测试。

不确定您要做什么,但这不是递归函数。您的问题不是递归函数,为什么要使用递归函数呢?如果第三个字符串的第一个和第二个字符串中包含所有字符,则返回True。问题中的例子不清楚?我不知道怎样才能解释得更清楚,抱歉,在这里使用排序要简单得多<代码>返回已排序(str1+str2)==已排序(str3)。对于O(N)解决方案而不是O(NlogN),更好的选择是:
从集合导入计数器
然后
返回计数器(str1+str2)==计数器(str3)
为什么要在
True
False
结果上使用
any
作为
str3
类型错误中的表达式
str1
:“bool”对象不适用于错误正确的Python版本应该使用
返回all(str3中的c表示str1+str2中的c)
all()
已经生成布尔值)。但是,这并没有考虑到str3中的任何额外字符<代码>str1='a';str2='a';str3='abcdef'将返回True,但这不是正确的解决方案。@MartijnPieters您的注释看起来是正确的actually@sakirecayyok:所以str3中的额外字符可以吗?这不能正确处理重复
str1='aaaaa'
str2='ababababab'
str3='ab'
。谢谢你的回答,但我想把它写成递归函数是的,我想我想把它写成递归函数,但是分割字符串不好?“分割字符串不好,我想”你能详细解释一下吗?话虽如此,我必须承认,我更多关注的是“递归部分”,而不是“优化”算法。@Sakirecayok:字符串切片非常有效,但使用
+
重新组合结果字符串的效率不高。