递归函数故障

时间:2015-01-28 09:27:07

标签: python function recursion python-3.4

我正在尝试创建一个递归函数,例如我的函数需要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

但这是错的。我怎样才能达到目标?

5 个答案:

答案 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;
  • 首先,为了拥有一个递归函数,你首先要有一个自己调用的函数
  • 然后,你应该有一些方法终止递归。这里,这是块的目的--1--和--3--。如果str3为空,则第一个将返回true,如果str3 [0]与str1和str2中的字符不匹配,则块--3--返回false。
  • 递归部分包含在块--2--中。那些将检查str3的第一个字符是否在另外两个字符串中的一个中,如果这是真的,则调用相同的函数,但稍微修改一下。

请注意,这在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