Fus*_*uss 5 c# recursion workflow pow
我正在通过“ sololearn”和udemy课程尝试学习C#。我正在尝试挑战,但无法弄清楚下面的代码如何与32结合使用(因为32是此处的正确答案,我试图找出原因)。有人可以向我解释这个过程吗,我认为调用自身的方法正在抛出我。
static double Pow(double x, int y)
{
if (y == 0)
{
return 1.0;
}
else
{
return x * Pow(x, y - 1);
}
}
static void Main()
{
Console.Write(Pow(2, 5));
}
Run Code Online (Sandbox Code Playgroud)
请原谅我的编码错误。我正在尝试在移动设备上执行此操作,这很困难,答案是32。有人可以解释为什么吗?
编辑:这里的道歉是我的工作方式。将2和5传递给Pow,检查是否y == 0为假,现在它是有效的,y == 5因此x * pow(x, y-1)公式将处于活动状态。X仍然是2,y现在是4,这意味着它再次无法检查是否等于0,此循环一直进行到返回1.0,x一直保持在2 2 * 1.0 = 2而不是32?
首先要注意的是,这通常不是实现幂函数的方式。通过这种方式演示了递归。
顺便说一句,让我们看看调用时会发生什么Pow(2, 5):
Pow(x = 2, y = 5)
-> return 2 * Pow(2, 4)
<- 2 * 16 = 32
Pow(x = 2, y = 4)
-> return 2 * Pow(2, 3)
<- 2 * 8 = 16
Pow(x = 2, y = 3)
-> return 2 * Pow(2, 2)
<- 2 * 4 = 8
Pow(x = 2, y = 2)
-> return 2 * Pow(2, 1)
<- 2 * 2 = 4
Pow(x = 2, y = 1)
-> return 2 * Pow(2, 0)
<- 2 * 1 = 2
Pow(x = 2, y = 0)
-> return 1 (because y == 0)
<- 1
Run Code Online (Sandbox Code Playgroud)
要阅读递归调用堆栈的这种表示形式,请从头到尾查看参数的变化方式。然后从下到上查看返回值(用指示<-)。
小智 8
好吧,让我们仔细研究一下整个过程。
首先,静态函数是无需实例化对象即可调用的函数。同一类的所有对象共享一个签名。double是C#中的一种类型,它在此处显示以显示该函数的最终输出类型。Pow是函数的名称,double x,int y是按其类型描述的参数(虽然名称不太好,但我们将其保留另一天)
因此,x是一个数字,y是该数字的幂。这里有条件检查两个结果。如果y为0,则答案始终为1,简单的数学运算。否则,该函数将使用递归执行算术运算(它将再次调用自身,直到满足终止条件为止)。我们得到32的原因是因为2x2x2x2x2 =32。它是2的5的幂。
我假设您知道main和console.write是什么。
该方法基本上计算“ x提高到”的幂y。它以递归方式执行此操作。
首先,它定义了一个基本情况:提高到0的幂的任何值为1。
然后,它定义了在所有其他情况下的处理方式:x * Pow(x, y - 1)。假设y很大,那是什么x * Pow(x, y - 1)?它是x * x * Pow(x, y - 2),反过来是x * x * x * Pow(x, y - 3)。在这里看到图案吗?最终,您将到达第二个参数y - N0的位置,即我们已经确定的第二个参数为1。到那时,x *我们得到了多少个参数?没错y。
让我们来看一下Pow(2, 5):
Pow(2, 5)
2 * Pow(2, 4)
2 * 2 * Pow(2, 3)
2 * 2 * 2 * Pow(2, 2)
2 * 2 * 2 * 2 * Pow(2, 1)
2 * 2 * 2 * 2 * 2 * Pow(2, 0)
2 * 2 * 2 * 2 * 2 * 1
Run Code Online (Sandbox Code Playgroud)
因此,结果为32。
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |