使用Python理解基本递归

时间:2016-03-16 01:44:32

标签: python recursion

我无法直观地看到递归函数中实际发生的事情。我已经尝试绘制激活帧并跟踪数据流,但我一路上都迷路了。 PythonTutor.com的可视化工具并没有像我希望的那样多。

这是一个使用递归确定数字中位数的函数。

def digits(x):
    if x > 0:
        return 1 + digits(x // 10)
    else:
        return 0

为什么1只能从一个激活帧“幸存”到另一个激活帧?

3 个答案:

答案 0 :(得分:2)

因此,如果我考虑x = 20,流程将如下:

End:   result = 2 <-----------.
                              |      +
Start: digits(20) ==> returns 1 <-----------.
                          +                 |      +  
                      digits(2) ==> returns 1 <-----------.
                                        +                 |
                                    digits(0) ==> returns 0

答案 1 :(得分:0)

使用递归,从基本情况开始通常很有用。你可以很容易地在纸上完成它。

digits(0)
x = 0
if x > 0 # false
return 0
digits(0) == 0

digits(1)
x = 1
if x > 0 # true
return 1 + digits(1 // 10)
return 1 + digits(0) # 1//10==0
return 1 + 0  # digits(0)==0
return 1
digits(1) == 1

...

digits(10)
x = 10
x > 0 # true
return 1 + digits(10 // 10)
return 1 + digits(1)
return 1 + 1
return 2
digits(10) == 2

等等。

答案 2 :(得分:0)

以数字(10)为例:

digits(10):
    if 10 > 0:
        return 1 + digits(10 // 10)
    <==>return 1 + digits(1)
    <==>return 1 + 
                    if 1 > 0:
                        return 1 + digits(1 // 10)
                    <==>return 1 + digits(0)
                    <==>return 1 + 
                                    if 0 > 0:
                                        return 1 + digits(0 // 10) 
                                    else:
                                        return 0
                    else:
                        return 0
    else:
        return 0
  • digits(0)返回0;

  • 位数(1 // 10)返回1 + 位数(0) = 1 + 0,

  • 位数(10)返回1 + 位数(1 // 10) = 1 + 1 + 0 = 2