我正在尝试创建一个递归函数,例如我的函数需要3个字符串。 str1,str2 and str3
。例如str1 = "abc" , str2 = "def" and 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
但这是错的。我怎样才能达到目标?
答案 0 :(得分:1)
如何使用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
答案 1 :(得分:1)
我猜你是否正处于学习递归函数的过程中?如果这是真的,这是一个例子:
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;
请注意,这在Python中效率不高 - 但在某些语言中有tail call optimization,这可能与循环一样有效。
答案 2 :(得分:0)
我可以尝试提出另一种解决方案:
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)))
(这假设“有效shuffle,因为str3具有str1和str2的所有字符。”意味着我们只检查str1或str2中的每个字符都在str3中)
您可以看到它正常here。
然而,您可以使用常规map
(如果您使用的是python 3.x,则无论如何都是迭代的),只需要+
字符串以避免itertools
,但我更喜欢迭代方法
关于递归部分,这个时候编写的代码不是递归的,因为它不会调用自身,幸运的是在这种情况下不需要它。
答案 3 :(得分:0)
我知道您想了解递归。 OTOH,在Python中不鼓励递归:如前所述,Python没有tail call optimisation,并且你可以递减的深度有限(尽管可以调整,如果需要的话)。
解决特定问题的简单方法是对字符串进行排序。然后比较它们。例如,
#! /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
如您所见,您可以将任意数量的源字符串传递给此函数,并针对目标字符串对其进行测试。
答案 4 :(得分:-2)
DISCLAMER:我不是一个python开发者,但我想给你一个解决问题的新方法。
也许你可以做这样的事情。
if any(str1 in str3) and any(str2 in str3):
return True