C语言的函数递归(下)

怎么用函数实现求n的阶乘,我们现用循环的方式实现:

int fac1(int n)
{
    int i = 0;
    int ret = 1;
    for ( i = 1; i <= n; i++)
    {
        ret *= i;
    }
    return ret;
}
int main()
{
    //求n的阶乘
    int n = 0;
    int ret = 0;
    scanf("%d", &n);
    //ret = fac1(n);//循环的方式
    printf("%d\n", ret);
    return 0;
}

这里我们首先要知道n的阶乘是123...n,所以我们定义一个变量i,当然i !=0,这样使用for循环满足条件输出ret =i,等于ret = ret i。输出ret,这样就求出i的阶乘。
接下来我们用递归的方法来实现:

int fac2(int n)
{
    if (n <= 1)
        return 1;
    else
        return n*fac2(n - 1);
}
int main()
{
    //求n的阶乘
    int n = 0;
    int ret = 0;
    scanf("%d", &n);
    ret = fac2(n);
    printf("%d\n", ret);
    return 0;
}

用递归的方法怎么实现呢,我们来找一下规律,无论n(n!=0)等于几它的第一位永远是1,所以if函数判断n<=1的情况下,输出1,else就是n>1的情况下,输出n(n-1),为什么是输出n(n-1)呢,因为n的阶乘等于123...(n-1)n,所以当n大于1的时候输出n(n-1)。


怎么用函数描述第n个斐波那契数:
我们首先要知道什么是斐波那契数列:
1 1 2 3 5 8 13 21 34 55 从这组数字可以得出斐波那契数列的规律就是第三个数字等于前面两个数字的和,接下来就是用递归的方法实现:

int fib(int n)
{
    if (n <= 2)
        return 1;
    else
        return fib(n - 1) + fib(n - 2);
}
int main()
{
    int n = 0;
    int ret = 0;;
    scanf("%d", &n);
    //TDD -测试驱动开发
    ret = fib(n);
    printf("ret = %d\n", ret);
    return 0;
}

当n<=2的时候,数列的前两项都是1,所以输出一个1
但是当n>2的时候,我们知道斐波那契数列的规律就是第三个数字等于前面两个数字的和,所以这里用(n-1)+(n-2),代表的是当我们要求第n个数的时候,它是由(n-1)+(n-2)得来的,也就是n前一位数和n前两位数,它们相加的和也就是第n个斐波那契数。


但是用递归的方法求斐波那契数列的效率很低,所以在这我们可以用循环的方法来求。

int fib(int n)
{
    int a = 1;
    int b = 1;
    int c = 1;
    while (n > 2)
    {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    return c;
}
int main()
{
    int n = 0;
    int ret = 0;;
    scanf("%d", &n);
    //TDD -测试驱动开发
    ret = fib(n);
    printf("ret = %d\n", ret);
    return 0;
}

当我们要求第n个数的时候,我们要用前两个数的和来得到第三个数,所以这里我们定义三个数分别为a,b,c,并且规定a+b=c,这时候我们需要用到while循环,但是循环条件怎么填呢,我们知道当n<=2的时候,永远输出的值为1,只有大于2 的时候,才会不断的增加,所以循环条件我们就输入n>2,假设我们求第3个斐波那契数,1+1=2,当我们要求第4个数的时候是不是用,1+2=3,此时的a变成了之前的b,b变成了之前的c,而c又等于a+b,这样不就构成了循环,最后的n--;代表没执行一次n就-1,这样当n<=2时跳出循环输出c。

2021.1.25
永远相信傻瓜计算机

猜你喜欢

转载自blog.51cto.com/15080720/2606462