【C语言】递归例题

计算斐波那契数

题解:

代码如下:

注意:利用递归的方法求斐波那契数是有缺陷的,当我们要求的数太大时

递归的方法就求不出来了,效率也缓慢,因此求斐波那契数还是用

迭代的方法好


//计算斐波那契数
//非递归(迭代)方法
//斐波那契数就是前两个数之和,我们可以从到到尾依次计算,得出结果
//关键在于n>=3开始依次计算,当n<3时,都为1
int My_get(int n)
{
    //定义三个变量
    //初始化都为1是因为第一第二个数是构不成斐波那契数的,结果都是1
    //因此不需要计算第一第二个数,从第三个数开始计算
    int i = 1;
    int m = 1;
    int a = 1;
    while (n >= 3)
    {
        //依次计算,将数值交换
        a = i + m;
        i = m;
        m = a;
        n--;//每计算一次就-1,直到n<3;
    }
    //n<3时返回1
    return a;
}
int main()
{
    //输入要求第几个斐波那契数
    int n = 0;
    scanf("%d", &n);
    //调用函数计算
    int ret = My_get(n);
    printf("%d\n", ret);
    return 0;
}

编写一个函数实现n的k次方,使用递归实现

代码如下:


计算一个数的每位之和(递归实现)

代码如下:


字符串逆序(递归实现)

代码如下:


//字符串逆序(递归实现)
/*题解:
*首先我们应理解题目要求,注意并不是实现逆序打印,
* 而是实现反向排序,因此当我们调用函数时,是不需要返回值的
* 实现这一功能应在调用函数内实现.
* 我们先滤清思路:(五部走)
* 1.使用变量存储第一个元素
* 2.最后元素到第一个元素位置
* 3.让最后一个元素位置 = '\0'
* 4.判断每次递归依次实现除了第一、最后的元素位置交换
* 5.将第一元素放到最后元素位置上
* 注意:第三步的原因是,当使用递归时,系统自动读取到'\0'才停止
*       因此 = '\0'是为了交换还未交换的值
*/
int my_strlen(char* arr)
{
    //定义变量存放长度
    int couse = 0;
    //利用循环,实现数组长度计算
    while (*arr != '\0')//这里求实际长度,为'\0'之前的元素
    {
        couse++;//元素长度累加
        arr++;//arr为第一个元素,持续加1,直到='\0'完成计算
    }
    return couse;
}
void reverse_string(char* string)//创建形参字符指针来接受实参元素首地址
{
    int right = my_strlen(string) - 1;//最后元素下标
    //第一步,将第一个元素暂存
    char tmp = *string;
    //第二步,让最后元素到第一元素位置
    *string = string[right];
    //第三步,将最后元素位置给上'\0'
    string[right] = '\0';
    //第四步,利用判断交换其它元素
    if (my_strlen(string + 1) >= 2)//判断条件的意思为,当计算的元素长度>=2时,继续交换,当<2,则只剩1个元素,就没必要交换
    {
        //递归调用
        reverse_string(string + 1);
    }
    //第五步,将第一元素放到最后元素位置上
    string[right] = tmp;

}
int main()
{
    //定义数组变量存放字符
    char arr[] = "abcdef";
    //调用函数
    reverse_string(arr);
    //打印反向排序的值
    printf("%s\n", arr);
    return 0;
}

strlen的模拟(递归实现)

递归和非递归分别实现strlen

递归:


递归方法
int my_strlen(char *arr)
{
    //判断,strlen求的是'\0'之前元素的个数,因此 = '\0'时不执行
    if (*arr != '\0')
    {
        return 1+my_strlen(arr + 1);//每次递归加1,函数内arr+1的意思为元素依次判断是否 = '\0'
    }
    return 0;//当元素为'\0'时,则元素长度为0

}
int main()
{
    //定义字符数组
    char arr[] = "abcdfergtj";
    //调用函数并将元素长度返回
    int sum = my_strlen(arr);
    printf("%s数组的元素长度是:%d\n", arr, sum);
    return 0;
}

非递归:


//非递归方法
int my_strlen(char* arr)
{
    //定义变量作为元素计数
    int num = 0;
    //循环依次计算
    while (*arr != '\0')
    {
        num++;//当元素不为'\0'加1
        arr++;//依次判断每个元素
    }
    return num;

}
int main()
{
    //定义字符数组
    char arr[] = "abcdfergtj";
    //调用函数并将元素长度返回
    int sum = my_strlen(arr);
    printf("%s数组的元素长度是:%d\n", arr, sum);
    return 0;

递归和非递归分别实现求n的阶乘(不考虑溢出的问题)

题解:

注意:

求n的阶乘时,当n>1时公式为->n的阶乘 == n * (n-1)的阶乘,n<=1时阶乘就为1

递归方法:


//递归方法:
int my_get(int n)
{
    //判断m,当n>1的时候,则需要进行计算
    if(n>1)
        return n * my_get(n - 1);//这里是求阶乘n的公式->n!=n*!函数(n-1)
    return 1;//当n<=1时,阶乘就是n本身1
    
}
int main()
{
    //输入要求的阶乘
    int n = 0;
    scanf("%d", &n);
    //调用函数
    int sum = my_get(n);
    printf("sum = %d\n", sum);
    return 0;
}

非递归方法:


//非递归方法
int my_get(int n)
{
    //定义变量进行循环
    int i = 0;
    //定义变量进行阶乘计算
    int m = 1;//初始化为1,为0都为0
    for (i = 1; i <= n; i++)
    {
        m *= i;//阶乘计算
    }
    return m;//返回

}
int main()
{
    //输入要求的阶乘
    int n = 0;
    scanf("%d", &n);
    //调用函数
    int sum = my_get(n);
    printf("sum = %d\n", sum);
    return 0;
}

递归方式实现打印一个整数的每一位


//递归方式实现打印一个整数的每一位
/*
    题解:
    1.打印一个整数的每一位,要分两种情况,当整数>9时,求出每一位
    当整数<10时,不需要求
    2.整数%10 == 个位 ->整数/10 == 千百十位....依次类推,就能依次得出每一位
      简单来说就是先%出个位,再/出其它位,依次往复,直到小于10
*/
void my_make(unsigned int n)
{
     if (n > 9)//n>9时,打印除了个位以外的数
    {
        my_make(n / 10);//每次递归得出除了个位上的数,然后进行打印
    }
    printf("%d ", n % 10);//打印个位上的数
}
int main()
{
    //输入整数
    unsigned int n = 0;
    scanf("%u", &n);
    //调用函数
    my_make(n);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值