使用函数的程序说明

时间:2014-01-23 05:37:06

标签: c function math

#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 ??

2 个答案:

答案 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)的计算值,可以避免这种爆炸。

相关问题