Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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
使用函数的程序说明 #包括 浮点数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 - Fatal编程技术网

使用函数的程序说明 #包括 浮点数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)); }

使用函数的程序说明 #包括 浮点数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

伙计们,你们能给我解释一下这个程序是怎么工作的吗? 我的意思是,如果我举个例子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(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));


}