为什么我在输出中得到一个额外的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
你应该从记分牌上抄作业。你必须修改:
Console.WriteLine("{0} * {1}", n, Factorial(n - 1));
通过
Console.WriteLine("{0} * {1}", n, n - 1);
这个错误导致了错误的输出。
这是因为日志输出中还有第二个阶乘循环:
Console.WriteLine("{0} * {1}", n, Factorial(n - 1));
这需要在打印任何东西之前计算阶乘(n-1)。因为递归的每一步现在都触发两个递归,所以它比你想象的要复杂得多!
所以阶乘(3):
如果你把它改成这样:
Console.WriteLine("{0} * Factorial({1})", n, n - 1);
然后你会得到更像你期望的日志记录的东西。
(如果您正在学习递归,那么使用调试器来完成工作并查看程序流程是如何进行的,以及为什么它会产生您确实看到的输出,对您来说可能会很有趣。)
您递归地调用函数两次,一次在输出中,然后在下一行中再次调用。这就是输出混乱的原因,因为您从控制台调用它。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