需要解释递归和生成器示例

时间:2016-09-01 14:17:43

标签: python python-3.x recursion generator yield

我有这个递归函数,用于为你传递给它的任何字符串值生成所有可能的up和lower case。

以下是代码示例和输出:

def test (name):

    if not name:
        yield ""

    else:
        first=name[:1]

        for sub in test(name[1:]):

            yield first.lower()+sub
            yield first.upper()+sub
            #print (first)

for x in test("abc"):
    print (x)

输出将如下:

abc
Abc
aBc
ABc
abC
AbC
aBC
ABC

如果我在两个yield函数下添加print函数:

print(first)

输出将是这样的:

abc
Abc
a
aBc
ABc
a
b
abC
AbC
a
aBC
ABC
a
b
c

我只是想要清楚地解释每个步骤以及发生了什么以及为什么我每次都获得这些值以及它是如何工作的,因为递归和生成器一起让我迷失在这里。

2 个答案:

答案 0 :(得分:0)

你在哪里制造自己的痕迹?您已经证明您知道如何使用打印语句。我假设您也知道如何搜索递归跟踪的其他示例; StackOverflow有很多。

为了帮助您入门,请在此处输入更多打印语句。

[Command not found: /bin/fish]

[Could not create a new process and open a pseudo-tty.]

输出:

def test (name):
    print ("ENTER test, name=", name)

    if not name:
        yield ""

    else:
        first=name[:1]

        for sub in test(name[1:]):
            print ("  LOOP\tname", name, "\tfirst", first, "\tsub", sub)

            yield first.lower()+sub
            yield first.upper()+sub
            #print (first)

for x in test("abc"):
    print ("YIELDED:", x)

这会让你朝着有用的方向前进吗?

答案 1 :(得分:0)

谢谢...... 昨天我刚拿了一张纸,一支笔,我从堆栈视图中追踪这个功能,我明白了......

它是递归的,所以函数每次都会从第二个字母到整个字符串的末尾调用自身,直到函数" test"用""价值......

然后我必须每次从最后一次到第一次应用for循环... 最后一个会有这样的变量:first =" c" ,sub =""

for each sub :
    first.lower+sub >> c 
    first.upper+sub>>  C

然后回到上一个调用将采取最后的结果 因此对于每个" c"并为每个" C"将适用

first.lower()+sub > bc bC 
first.upper()+sub > bC BC

然后回到最后一个结果的第一个电话
现在我们有sub = bc,Bc,bC,BC 并且首先是' a'

 for each sub :

first.lower+sub
first.upper+sub

abc
Abc
aBc
ABc
abC
AbC 
aBC
ABC