使用函数的程序说明 #包括 浮点数a(整数n); main() { int N; 浮动z; puts(“n剂量(>=2)”; scanf(“%d”和“&N”); z=a(N); printf(“Gia n=%d h anadromikh sxesh dinei%f\n”,n,z); } 浮点a(整数n) { 如果(n==2) 返回(7); else如果(n==3) 返回((8*49-1)/1); 其他的 返回((8*a(n-1)*a(n-1)-1)/a(n-2)); }
伙计们,你们能给我解释一下这个程序是怎么工作的吗? 我的意思是,如果我举个例子n=8,它将如何找到a7,a6等,从而得到a8???基本上 在C\C++编程中,函数调用作用于内存中的 在你的程序中,你递归地调用函数使用函数的程序说明 #包括 浮点数a(整数n); main() { int N; 浮动z; puts(“n剂量(>=2)”; scanf(“%d”和“&N”); z=a(N); printf(“Gia n=%d h anadromikh sxesh dinei%f\n”,n,z); } 浮点a(整数n) { 如果(n==2) 返回(7); else如果(n==3) 返回((8*49-1)/1); 其他的 返回((8*a(n-1)*a(n-1)-1)/a(n-2)); },c,function,math,C,Function,Math,伙计们,你们能给我解释一下这个程序是怎么工作的吗? 我的意思是,如果我举个例子n=8,它将如何找到a7,a6等,从而得到a8???基本上 在C\C++编程中,函数调用作用于内存中的 在你的程序中,你递归地调用函数 返回((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)->(8*a(6)*a(6)-1)/a(5)) 对于a(6)->(8*a(5)*a(5)-1)/a(4)) 对于a
返回((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)->(8*a(6)*a(6)-1)/a(5))
对于a(6)->(8*a(5)*a(5)-1)/a(4))
对于a(5)->(8*a(4)*a(4)-1)/a(3))
对于a(4)->(8*a(3)*a(3)-1)/a(2))
对于a(3)程序将返回(8*49-1)/1
对于a(2)程序将返回(7)
所有这些函数都将在堆栈内存中获得自己的堆栈段
以及工作时的堆栈段
堆栈段将来自最后一个a(8)->a(7)->a(6)->a(5)->a(4)->a(3)->a(2),它取决于编译器的函数调用方法,因此堆栈段函数调用可能会有所不同。
希望这能帮助您理解。当您调用函数a时,它要么立即为n=2或3返回一个值,要么用n-1执行两次调用,用n-2执行一次调用,然后返回一个值
因此:
a(2)立即返回
a(3)立即返回
a(4)调用a(3)两次,a(2)调用一次,然后返回
a(5)调用a(4)两次(每次调用a(3)两次和a(2)一次),a(3)一次然后返回
a(6)调用a(5)两次(每次调用a(4)两次[每次调用a(3)两次和a(2)一次]和a(3)一次)和a(4)(调用a(3)两次和a(2)一次)一次,然后返回
a(7)调用a(6)两次(每次调用a(5)两次[每次调用a(4)两次{每次调用a(3)两次和a(2)一次}和a(3)一次]和a(4)[调用a(3)两次和a(2)一次]和a(5)两次[每次调用a(4)两次]和a(3)一次]然后返回
a(8)调用a(7)两次(每次调用a(6)两次[每次调用a(5)两次{每次调用a(4)两次和a(3)一次}和a(4){调用a(3)两次和a(2)一次}一次]和a(5)[调用a(4)两次{每次调用a(3)两次和a(2)一次}和a(3)一次]和a(6)(调用a(5)两次[每次调用a(4)两次]{每次调用a(3)两次和a(2)一次}和a(3)一次]和a(4)[调用a(3)两次和a(2)一次]一次)然后返回
正如您所看到的,一个调用会导致许多间接调用,参数值较低。幸运的是,没有无限的调用链,但间接调用的数量随着n呈指数增长
可以通过在计算a(n)时记住它的值来避免这种爆炸。它被称为递归。请参阅Wikipedia文章。在您的程序中,该函数是递归调用的。
#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));
}