当前位置: 首页 > 知识库问答 >
问题:

有人能直观地解释一下这段代码吗?

冷宏茂
2023-03-14

我理解递归以及它给高效编写代码带来的好处。虽然我可以编写递归函数,但我似乎无法理解它们是如何工作的。我希望有人本能地向我解释递归。

例如,此代码:

int fact(int n)
    { if n<0:
        return -1
      elif n==0:
        return 1
      else
        return n*fact(n-1)
    }

这些是我的一些问题:

>

  • 假设 n=5。进入函数后,控件转到最后一个 return 语句,因为不满足前面的条件。现在,粗略地说,计算机“写”了这样的东西:5*(fact(4))再次调用fact()函数并重复相同的过程,但现在我们有n=4。那么,编译器究竟如何将 5*4 等相乘直到 2,因为它不完全是 5*4,而是 5*fact(4)。它如何“记住”它必须乘以两个整数,以及由于我们没有提供任何明确的数据结构,它在哪里存储临时值?

    再次假设n=5。同样的过程继续进行,最终n减为0。我的问题是,函数为什么/如何不返回return语句中所述的1。与我之前的问题类似,编译器如何“记住”它还存储了180个用于显示?

    如果有人能给我完整的解释,让我更好更直观地理解递归,我会非常感激。

  • 共有2个答案

    东门仲卿
    2023-03-14

    你可以看到有点像这样

    函数事实(int n)就像一个类,每次调用事实(int n)时,您都会创建该类的一个实例。通过从同一个函数创建它们(调用它们),您正在创建一个实例链。一旦达到中断条件,这些函数就开始一个接一个地返回,它们返回的值在返回语句返回n*事实(n-1)中计算一个新值,例如返回3*事实(2);

    滕祯
    2023-03-14

    是的,对于初学者来说,递归很容易混淆。但是,你在“1”下的解释已经是正确的了。

    函数将被递归调用,直到满足中断条件。在这种情况下,当n等于0时,满足中断条件。此时,将不再进行递归调用。每个递归调用的结果都返回给调用者。呼叫者总是“等待”直到他们得到结果。这就是算法如何“知道”结果的接收者。此过程的流程由所谓的堆栈处理。

    因此,在你的非正式符号中(在这个例子中n等于3):

    3*(fact(2)) = 3*(2*fact(1)) = 3*(2*(1*fact(0))).
    

    现在,n 等于 0。因此,内部事实 (0) 返回 1:

    3*(2*(1*(1)))) = 3*(2*(1)) = 3*(2) = 6
    
     类似资料:
    • 我有这两种方法。我理解“getTotalSalary”一词,但并不真正理解“getAverageSalary(获取平均工资)”的写作方式。我不明白为什么在结尾处使用问号和冒号以及“(size()!=0)”和0。 这是编码: empReg 是 ArrayList 的名称。员工是一个由“姓名”和“薪水”组成的阶级。getSalary 显然是一种返还薪水的方法。

    • 我是Hibernate和JPA的新手,我对这个注释有问题。有人能简单地解释一下这个注释到底在做什么吗?因为在这种情况下,文档对我来说很难理解。 编辑我明白什么是持久上下文,但在代码中,我有这样的例子: 我对@PerustenceContext做什么有问题。抱歉,也许我没有具体说明。

    • 问题内容: 我只是在android上开始,而我的java很生锈。我不记得曾经见过像这样嵌套在另一个函数中的函数。有人可以向我确切解释final的作用,并解释为什么您要在另一个函数中嵌套这样的功能吗? 问题答案: 这是一个匿名类。实际发生的情况是正在使用重写的函数创建 的子类。 关于匿名类的最优雅的事情之一是,它们使您可以在需要的地方准确定义单发类。此外,匿名类具有简洁的语法,可减少代码中的混乱情况

    • 我这里有一些关于Java的练习问题。我们应该在不使用编译器的情况下确定答案。 参考以下方法: 调用product(6)时的输出是什么? D)48 E)70 根据答案,正确的输出是48。我真的不明白为什么这是真的。6不符合基本情况,所以转到else语句。那么,乘积(6-2)=乘积(4),乘积(2)得到乘积(0),乘积(2)得到乘积(0),得到6*4,4*2,2*0,0*0。但那是32,不是48?是不

    • 这是我从骡子3到骡子4转换的第一个项目。我与mule4一起工作,但在Mule3是新的。有谁能帮帮我吗?你能告诉我这些自定义处理器和变压器在这个mule3代码中的用途吗?而Mule4中的等价代码会是什么呢?在骡子4中没有像这样的自定义变压器。请帮帮我..

    • 问题内容: 问题答案: 作用 在你的Chrome浏览器的控制台中输入这段代码,你会发现不同HTML层都被使用不同的颜色添加了一个高亮的边框。是不是非常酷?但是,简单来说,这段代码只是首先获取了所有的页面元素,然后使用一个不同的颜色为它们添加了一个1px的边框。 解析 => 调用引用数组的forEach方法 => => => 对二进数1小数点右移24位 => 获得了一个位于之间的随机整数,也就是随机

    • 我写了这个和我从谷歌和其他来源看到的一些部分,但我不能理解公共静态int[]直方图中的else部分 这个新Arr[计数]如何;作品有人可以向我解释,请

    • 我想写一个brainfuck口译员,但我错过了一些上下文或其他东西。应该被调用以处理“