有人可以在python中解释这个递归函数的输出吗?

时间:2018-03-22 10:15:06

标签: python python-3.x function recursion

这是python3中的一个函数,它打印1到10.由于我是一个编程菜鸟,因此有一些我不了解的事情。

只要该数字大于1,此函数将从给定数字中减去1.因此,如果数字= 10,则将从10减去1得到9,然后从9减去1得到8,依此类推......直到它达到1,将被打印到屏幕上。

我不明白为什么函数随后打印2,3,4,5,6,7,8,9和10.因为这些数字高于1,所以不应该输入if -statement然后不打印?根据我对代码的理解,只会打印等于或小于1的数字。

换句话说:"为什么输出这个功能,而不是" 1" ?单独"

def print_numbers(number): 
    if number > 1: 
        print_numbers(number-1) 
    print(number) 
print_numbers(10)

你可以试试python中的代码,看看输出是1到10吗?

4 个答案:

答案 0 :(得分:0)

在这个块中:

string(i)

解释器在该条件下输入list(string) # ['H','e','l','l','o'] 函数,但之后也会打印该数字。如果将print放在else分支中,则会产生预期的效果:

if number > 1: 
    print_numbers(number-1) 
print(number) 

答案 1 :(得分:0)

这是怎么回事:

  1. 呼叫功能:print_numbers(10)

  2. 呼叫功能:print_numbers(9)

  3. 等。等

    1. 呼叫功能:print_numbers(1)
    2. 在print_numbers(1)中没有调用下一个函数,所以

      evetSourceAppChan

      被跳过。现在调用print语句,您的程序将打印' 1'。

      1. print_numbers(1)继续并打印1

      2. print_numbers(2)继续并打印2

      3. 等等。

        如果您之前要使用print语句,请执行以下操作:

        eventsH sid = Tagged $ \req respond -> do
            mCh <- lookupChannel env sid
            case mCh of
                Nothing -> do
                    let msg = "Could not find session with id: "
                           <> TLE.encodeUtf8 (T.pack (show sid))
                    respond $ responseLBS status404 [] msg
                Just ch -> do
                    ch' <- dupChan ch
                    eventSourceAppChan ch req respond
        

        首先打印,然后调用该函数,返回10,9,8,7等等。

答案 2 :(得分:0)

你以错误的方式阅读说明书...... 在函数体中,指令的顺序如下:

如果数字大于1,则函数调用函数并在打印值之前等待其完成。因此,如果调用print_numbers(10):

  • 它调用print_numbers(9)并等待
  • print_numbers(8)调用print_numbers(7)并等待
  • print_numbers(7)调用print_numbers(6)并等待

...

  • print_numbers(1)打印1并返回
  • print_numbers(2)恢复,打印1并返回
  • print_numbers(3)恢复,打印1并返回

...

  • print_numbers(9)恢复,打印1并返回
  • print_numbers(10)恢复,打印1并返回

请注意,print语句与if语句具有相同的缩进。 Si调用if block,然后继续执行print语句。

答案 3 :(得分:0)

我一直在努力想像自己自己在递归函数中实际发生的情况。但是,事件的顺序是:

该函数被调用,并传递一个值给它。在您的示例中为10。

10然后存储在内存中 函数检查是否10> 1

,如果为true,则减去1

9传递回函数的开头并存储在内存中。它位于10之后,仍在内存中

功能检查9> 1 如果为true,则减去1

8然后传回,存储在内存等中

一直持续到传回的剩余值不大于1

我们现在有: 10、8、7、6、5、4、3、2

依次存储在内存中

然后该函数移至打印语句并打印出从最后一个要存储在内存中的数字,即2

然后丢弃2并继续进行处理3,以此类推,直到最终打印并丢弃10(内存中的第一个条目)。

试图弄清楚可追溯的阶乘方程在做什么之后,我发现了一个出色的可视化工具,可以帮助您理解此类方程式中发生的事情。

链接在这里:

Python Tutor by Philip Guo

为了简洁起见,我使用值4,但是如果要使用任何值,则可以编辑代码。

一些编码概念使我的大脑融化了,但我一直在努力学习!我希望该工具有所帮助,对我的确是:0)