Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 递归绘制幂(2,6)的重复平方图_Algorithm_Recursion_Data Structures - Fatal编程技术网

Algorithm 递归绘制幂(2,6)的重复平方图

Algorithm 递归绘制幂(2,6)的重复平方图,algorithm,recursion,data-structures,Algorithm,Recursion,Data Structures,我很难理解绘制递归重复方块图的过程 我有一本书,第210页显示了以下代码: 公共静态双电源(双x,整数n){ 如果(n==0) 返回1; 否则{ double partial=幂(x,n/2);//依赖于n的截断除法 双结果=部分*部分; if(n%2==1)//如果n为奇数,则包括x的额外因子 结果*=x; 返回结果; } } 和幂(2,13)的递归跟踪: 但不清楚他们如何在每一步中绘制和计算平方。 他们是如何跳过指数跳到不同的数字的? 我不知道他们是如何绘制上图的,也不知道幂(2,13)

我很难理解绘制递归重复方块图的过程

我有一本书,第210页显示了以下代码:

公共静态双电源(双x,整数n){
如果(n==0)
返回1;
否则{
double partial=幂(x,n/2);//依赖于n的截断除法
双结果=部分*部分;
if(n%2==1)//如果n为奇数,则包括x的额外因子
结果*=x;
返回结果;
}
}
和幂(2,13)的递归跟踪:

但不清楚他们如何在每一步中绘制和计算平方。 他们是如何跳过指数跳到不同的数字的? 我不知道他们是如何绘制上图的,也不知道幂(2,13)的计算是如何绘制的。
有人能帮我解释一下这个概念吗?欢迎使用示例。

您在递归跟踪中看到的数字差异来自代码中的
n/2
。它是一个整数除以2。所以13/2是6,6/2是3,3/2是1,最后1/2是0。这是从上到下阅读图表时看到的内容。该图显示这些条目越来越向右移动,以表示递归的深度。函数调用自身,然后再次调用自身,…等等。所有这些电话都挂起。。。每次这些调用传递的
n
值都较小(减半)

在某个地方停下来。当然,它需要这样做。当
n
的值接收到值0时,此操作停止。您可以在图表的底部看到这种状态。此时,递归不再深入并开始展开,您需要从下到上阅读图表。如果
n
等于0,则返回值为1(
return1

该值由函数执行读取,其中
n
为1,调用
power(2,0)
并等待返回值。结果它接收到1。然后对该值进行平方(
partial*partial
),在本例中仍然为1。因为
n
是奇数(这里是1),所以还有一个额外的乘法
*=x
。所以我们实际上计算了
partial*partial*x
,也就是
1*1*2
。您将在图表中看到这一点

该值(2)返回到函数执行,其中
n
为3,调用
power(2,1)
。结果它收到2个。然后将该值平方(
partial*partial
),在本例中为4。因为
n
是奇数(这里是3),所以有一个额外的乘法
*=x
。所以我们实际上计算了
partial*partial*x
,也就是
2*2*2
。您将在图表中看到这一点

我希望你能看到这种模式。对于结果挂起的函数执行,都会从所做的递归函数调用中获取它们的值,并与之相乘,然后将其返回给调用方


因此递归回溯到顶部,为顶级调用
power(2,13)

提供最终结果。虽然欢迎链接,但理解问题所需的信息应该嵌入到问题中,而不是链接后面。明白@trincott感谢您的深入解释。这比这本书要清楚得多。我完全理解你写的每一个字。谢谢你编辑我的问题。