C语言的函数递归(下)

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

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 从这组数字能够得出斐波那契数列的规律就是第三个数字等于前面两个数字的和,接下来就是用递归的方法实现:code

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。it

2021.1.25
永远相信傻瓜计算机for循环

相关文章
相关标签/搜索