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

递归,无法理解输出

慎星纬
2023-03-14

为什么我在输出中得到一个额外的1*1,这有点倒退?有点像递归初学者,希望得到详细的答案。

class Program
{

    public static long Factorial(int n)
    {
        if (n == 0)
            return 1;

        Console.WriteLine("{0} * {1}", n, Factorial(n - 1));
        return n * Factorial(n - 1);    
    }
    static void Main(string[] args)
    {
       long a = 0;
        a = Factorial(3);
        Console.WriteLine(a);
    }
}

输出

1 * 1
2 * 1
1 * 1
3 * 2
1 * 1
2 * 1
1 * 1
6

共有3个答案

艾和通
2023-03-14

你应该从记分牌上抄作业。你必须修改:

    Console.WriteLine("{0} * {1}", n, Factorial(n - 1));

通过

    Console.WriteLine("{0} * {1}", n, n - 1);

这个错误导致了错误的输出。

欧阳学真
2023-03-14

这是因为日志输出中还有第二个阶乘循环:

Console.WriteLine("{0} * {1}", n, Factorial(n - 1));

这需要在打印任何东西之前计算阶乘(n-1)。因为递归的每一步现在都触发两个递归,所以它比你想象的要复杂得多!

所以阶乘(3):

  • 开始记录“3*阶乘(2)”-
  • 阶乘(1)开始记录“1*Factorial(0)-

如果你把它改成这样:

Console.WriteLine("{0} * Factorial({1})", n, n - 1);

然后你会得到更像你期望的日志记录的东西。

(如果您正在学习递归,那么使用调试器来完成工作并查看程序流程是如何进行的,以及为什么它会产生您确实看到的输出,对您来说可能会很有趣。)

祝嘉懿
2023-03-14

您递归地调用函数两次,一次在输出中,然后在下一行中再次调用。这就是输出混乱的原因,因为您从控制台调用它。WriteLine()方法,然后立即在返回语句中再次调用它。

因此,在一个三元代码的输出中,我也可以对一个三元代码的输出进行检查。

Console.WriteLine("{0} * {1}", n, Factorial(n - 1));  // Calling it once
return n * Factorial(n - 1);    // Calling it again, oops!

这里有一个小小的调整可以帮助你:

public static long Factorial(int n)
{
    if (n == 0)
        return 1;
    Console.WriteLine("{0} * {1}", n, (n>1?n-1:n));
    return n * Factorial(n - 1);    
}

static void Main(string[] args)
{
   long  a = Factorial(3);
    Console.WriteLine(a);
}

产量

3 * 2
2 * 1
1 * 1 
6
 类似资料:
  • 问题内容: 这是我第一次问问题,希望你们中的一些人有时间回答。 因此,我的目标是使用turtle模块编写一个python脚本来编写毕达哥拉斯树。 我已经花了几天时间,但确实无法超越某个特定点,因此我在网上寻找帮助。我找到了可以满足我的要求的代码,但是只包含很少的代码行: 因此,我理解大多数代码,但“ if”的第二和第三段除外:为什么要执行它们?如果函数不断重复自身,它将永远无法正常到达该点!我确定

  • 目前正在用Daniel Liang的C++入门自学C++。 关于合并排序的话题,我似乎无法理解他的代码是如何递归调用自己的。 我理解合并排序的一般概念,但我很难具体理解这段代码。 在本例中,我们首先将列表1,7,3,4,9,3,3,1,2及其大小(9)传递给mergeSort函数。从那里,我们将列表一分为二,直到数组大小达到1。在这种情况下,我们会得到:1,7,3,4->1,7->1。然后我们进入

  • 最初,我发布了一个问题“理解尾部递归向量- Q2)尾递归,这让我很难理解。我理解他们为什么需要尾递归,基本上他们用它来避免迭代,所以他们使用helper作为中间例程...所以他们可以避免将每次迭代放入堆栈...类似这样的东西。和letrec/lambda表达式,如下所示: 第Q2-2行:为什么这是“局部递归”“局部”对我来说是递归的中间例程。。。在这里中间意味着我的理解。。 [我的困惑]尾递归是不

  • 问题内容: 我得到以下代码: 我可以理解诸如阶乘和斐波那契这样的递归,但是对于这一点我不能理解。我试图追踪逻辑: 我总是以其他任何数字结尾7,我知道这是错误的,因为在运行程序时会得到不同的值。您能帮我了解递归在这里如何工作吗? 问题答案: 我认为这是不言自明的,如果您需要更多信息,请评论!

  • 问题内容: 我正在尝试使用numpy中的arpgpartition,但似乎出了点问题,我似乎无法弄清楚。这是正在发生的事情: 这些是排序数组的前5个元素 但是当我使用 当我认为应该得到与排序数组相同的结果时? 当我使用3作为参数时,它可以正常工作 这对我来说没有多大意义,希望有人可以提供一些见解? 编辑:重新解释这个问题,因为argpartition是否保留k个分区元素的顺序更有意义。 问题答案:

  • 我试图更好地理解递归和return语句的工作方式。因此,我看的是一段代码,用来识别与给定项相关联的斐波那契数--在本例中是4。我很难理解else的说法。 我尝试使用Visualize Python检查每一步发生了什么,但当它碰到else语句时,我就迷路了。 它看起来像是取n的值,然后减去1,创建一个新的n值3,并返回到函数定义中。因此它似乎只是从else语句中的第一个函数返回值。然而,编写else