#include <stdio.h>
float a(int n);
main()
{
int N;
float z;
puts("Dose to n (>=2)");
scanf("%d",&N);
z=a(N);
printf("Gia n=%d h anadromikh sxesh dinei %f\n",N,z);
}
float a(int n)
{
if(n==2)
return (7);
else if(n==3)
return ((8*49-1)/1);
else
return ((8*a(n-1)*a(n-1)-1)/a(n-2));
}
伙计们,请您解释一下这个程序是如何运作的? 我的意思是,如果我举例如n = 8,它将如何找到a7,a6等所以它得到a8 ??
答案 0 :(得分:1)
基本上,
在C \ C ++编程中,函数调用工作在内存中的 Stack Segment 。See Here
在你的程序中,你递归地调用函数。
return ((8*a(n-1)*a(n-1)-1)/a(n-2));
在此阶段输入n = 8
全部功能
a(8) ->(8*a(7)*a(7)-1)/a(6)))
a(7) - &gt; (8*a(6)*a(6)-1)/a(5)))
代表 a(6) - &gt; (8*a(5)*a(5)-1)/a(4)))
a(5) - &gt; (8*a(4)*a(4)-1)/a(3)))
代表 a(4) - &gt; (8*a(3)*a(3)-1)/a(2)))
a(3)程序将返回(8*49-1)/1
a(2)程序将返回(7)
这些函数将在堆栈内存中获得自己的堆栈段。
堆栈段在LIFO上工作。
堆栈段将来自Last a(8) - &gt; a(7) - &gt; a(6) - &gt; a(5) - &gt; a(4) - &gt; a( 3) - &gt; a(2)并且它取决于编译器的函数调用方法,因此堆栈段函数调用可能会有所不同。 希望这能帮助你理解。
答案 1 :(得分:0)
当你调用函数a时,它会立即为n = 2或3返回一个值,或者用n-1执行两次调用,用n-2执行一次调用,然后返回一个值。
所以:
a(2)立即返回。
a(3)立即返回。
a(4)调用a(3)两次,a(2)调用一次然后返回。
a(5)调用a(4)两次(每次调用(3)两次,a(2)调用一次)和a(3)调用一次然后返回。
a(6)调用a(5)两次(每次调用(4)两次[每次调用(3)两次,a(2)调用一次]和(3)调用一次)和a(4) (调用(3)两次,然后调用(2)一次)然后返回。
a(7)两次调用(6)(每次调用(5)两次[每次调用(4)两次{每次调用(3)两次,a(2)调用一次}和a( 3)一次]和(4)[调用(3)两次,一次调用(2)一次)和a(5)(调用(4)两次[每次调用(3)两次和a(2) )一次]和(3)一次)然后返回。
a(8)两次调用(7)(每次调用(6)两次[每次调用(5)两次{每次调用一次(4)两次,一次调用(3)一次}和a( 4){召唤一个(3)两次,一个(2)一次}一次]和一个(5)[呼叫一个(4)两次{每次呼叫一个(3)两次和一个(2)一次}和一个(3) )一次]一次)和一次(6)(两次调用(5)[每次调用一次(4)两次{每次调用一次(3)两次,一次调用(2)一次}和一次调用(3)一次]和a(4)[召唤(3)两次,a(2)一次]一次)然后返回。
...
如您所见,调用会导致许多具有较低参数值的间接调用。幸运的是,没有无限的调用链,但是间接调用的数量随着n而呈指数增长。
通过记住a(n)的计算值,可以避免这种爆炸。