【问题标题】:Need explanation on recursive and generator example需要解释递归和生成器示例
【发布时间】:2017-01-09 11:38:25
【问题描述】:

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

这是代码示例和输出:

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(first)

输出会是这样的:

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

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

【问题讨论】:

  • 您正在处理生成器这一事实在这里没有任何区别。如果你有 return 而不是 yield 并进行一些重新组织,那将是完全相同的。此外,如果您对 slicing 感到满意,那么生成器应该不难理解。最后一点,打印first 并不能让您深入了解。尝试在每次调用时打印函数中的 argument。
  • 谢谢你的回复....是的,我已经试过了,我得到了我脑海中应该是什么参数通过“abc”参数通过“bc”参数通过“c”参数通过了“”,但问题是你是否理解生成和递归..只要给我这个程序的痕迹..我只想逐步了解它是如何工作的......为什么它打印 abc , Abc 然后 aBC .. .从代码中,下一个调用“首先应该等于”b”!!我在这里想念一些关于递归的东西!!

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


【解决方案1】:

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

它是递归的,所以函数每次都会从第二个字母到整个字符串的结尾调用自己,直到函数“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

【讨论】:

    【解决方案2】:

    您在生成自己的踪迹时遇到了哪些困难?您已经证明您知道如何使用 print 语句。我假设您也知道如何搜索递归跟踪的其他示例; StackOverflow 有很多。

    为了让您开始,这里是您的代码,其中包含更多 print 语句。

    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)
    

    输出:

    ENTER test, name= abc
    ENTER test, name= bc
    ENTER test, name= c
    ENTER test, name= 
      LOOP  name c  first c     sub 
      LOOP  name bc     first b     sub c
      LOOP  name abc    first a     sub bc
    YIELDED: abc
    YIELDED: Abc
      LOOP  name abc    first a     sub Bc
    YIELDED: aBc
    YIELDED: ABc
      LOOP  name bc     first b     sub C
      LOOP  name abc    first a     sub bC
    YIELDED: abC
    YIELDED: AbC
      LOOP  name abc    first a     sub BC
    YIELDED: aBC
    YIELDED: ABC
    

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

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 2015-03-10
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      相关资源
      最近更新 更多