函数章节习题3

函数

目录

函数

第1题

第2题

第3题(编程题)打印数或字符

第4题(编程题)求阶乘

第5题(编程题)strlen的模拟实现

第6题(编程题)字符串逆序(递归实现)

第7题(编程题)计算一个数的每位之和(递归实现)

第8题(编程题)递归实现r的k次方

第9题(编程题)斐波那契数

第1题

第1题(单选题)
题目名称:
关于递归的描述错误的是:(C)
题目内容:
A.存在限制条件,当满足这个限制条件的时候,递归便不再继续
B.每次递归调用之后越来越接近这个限制条件
C.递归可无限递归下去
D.递归层次太深,会出现栈溢出现象

第2题

第2题(单选题)
题日名称:
根据下面递归函数:调用函数Fun(2),返回位是多少(D)
int Fun(int n)
{
    if(n == 5)
        return 2;
    else
        return 2*Fun(n+1);
}
题日内容:
A.2
B.4
c.8
D.16
栈区局部变量 函数参数 调用函数是返回值等临时变量
堆区动态内存分配
静态区全局变量 静态变量

每次递归,都要在栈里面开辟一块内存,但是栈是有限度的,如果递归次数过多,就会耗尽内存,直至栈溢出。

第3题(编程题)打印数或字符

第3题(编程题) 题目名称: 打印一个数的每一位 题目内容: 递归方式实现打印一个整数的每一位

#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{
    if(*str != '\0')
        return 1 + my_strlen(str+1);
    //return 1 + my_strlen(str++)//str后置是不行的,就把原来的str替换掉了
    //return 1 + my_strlen(++str)//str前置是可以的
}
int main()
{
    char arr[] = {};
    scanf("%s",&arr);
    printf("%d\n",my_strlen(arr));
    return 0;
}

第4题(编程题)求阶乘

第4题(编程题) 题目名称: 求阶乘 题目内容: 递归和非递归分别实现求n的阶乘(不考虑溢出问题)

#include<stdio.h>
int Fac(int n)
{
    if(n <= 1)
        return 1;
    else 
        return n * Fac(n - 1);
}
int main()
{
    int n;
    scanf("%d",&n);
    int ret = Fac(n);
    printf("%d",ret);
    return 0;
}//递归函数
#include<stdio.h>
int Fac(int n)
{
    int ret = 1;
    for(int i = 1;i <= n; i++)
    {
        ret = ret * i;
    }
    return ret;
}
int main()
{
    int n;
    scanf("%d",&n);
    int ret = Fac(n);
    printf("%d",ret);
    return 0;
}//非递归函数

第5题(编程题)strlen的模拟实现

第5题(编程题) 题目名称: strlen的模拟实现 题目内容: 递归和非递归分别实现strlen

#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{
    int count;
    while(*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}
int main()
{
    char arr[] = {};
    scanf("%s",&arr);
    printf("%d\n",my_strlen(arr));
    return 0;
}//非递归函数
#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{
    if(*str != '\0')
        return 1 + my_strlen(str+1);
}
int main()
{
    char arr[] = {};
    scanf("%s",&arr);
    printf("%d\n",my_strlen(arr));
    return 0;
}

第6题(编程题)字符串逆序(递归实现)

第6题(编程题) 题目名称: 字符串逆序(递归实现) 题目内容: 编写一个函数reverse_string(char*string)(递归实现) 实现:将参数字符串中的字符反向排列,不是逆序打印 要求:不能使用C函数库中的字符串操作函数

#include<stdio.h>
int my_strlen(char* str)
{
    int count = 0;
    while(*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}
void reverse_string(char* str)
{
    int left = 0;
    int right = my_strlen(str) - 1;
    while(left < right)
    {
        char tmp = str[left];
        str[left] = str[right];
        str[right] = tmp;
        left++;
        right--;
    }
}
int main()
{
    char arr[] = {};
    scanf("%s",&arr);
    reverse_string(arr);//数组名arr是首元素的地方
    printf("%s\n",arr);
    return 0;
}//非递归函数——数组
#include<stdio.h>
int my_strlen(char* str)
{
    int count = 0;
    while(*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}
void reverse_string(char* str)
{
    int left = 0;
    int right = my_strlen(str) - 1;
    while(left < right)
    {
        char tmp =*( str + left);//利用指针的形式
        *( str + left) = *( str + right);
        *( str + right) = tmp;
        left++;
        right--;
    }
}
int main()
{
    char arr[] = {};
    scanf("%s",&arr);
    reverse_string(arr);//数组名arr是首元素的地方
    printf("%s\n",arr);
    return 0;
}//非递归函数——指针
#include<stdio.h>
int my_strlen(char* str)
{
    int count = 0;
    while(*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}
void reverse_string(char* str)
{
    char tmp = *str;
    int len = my_strlen(str);
    *str = *(str + len - 1);
    *(str + len - 1) = '\0';
    if(my_strlen(str+1) >= 2)
    {
        reverse_string(str + 1);
    }
    *(str + len -1) = tmp;
}
int main()
{
    char arr[] = {};
    scanf("%s",&arr);
    reverse_string(arr);//数组名arr是首元素的地方
    printf("%s\n",arr);
    return 0;
}//递归函数

第7题(编程题)计算一个数的每位之和(递归实现)

第7题(编程题) 题目名称: 计算一个的每位之和(递归实现) 题目内容: 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

#include<stdio.h>
int DigitSum(int n)
{
    int sum = 0;
    while(n%10 != 0)
    {
        sum += n % 10; 
        n /= 10;
    }
    return sum;
}
int main()
{
    int n;
    scanf("%d",&n);
    int sum = DigitSum(n);
    printf("%d\n",sum);
    return 0;
}//非递归函数
#include<stdio.h>
int DigitSum(int n)
{
    if(n > 9)
        return DigitSum(n/10) + n % 10;
    else
        return n;
}
int main()
{
    int n;
    scanf("%d",&n);
    int sum = DigitSum(n);
    printf("%d\n",sum);
    return 0;
}//递归函数

第8题(编程题)递归实现r的k次方

第8题(编程题) 题目名称: 递归实现r的k次方 题目内容: 编写一个函数实现n的k次方,使用递归实现

#include<stdio.h>
double my_pow(int n,int k)
{
    if(k == 0)
        return 1.0;
    else if(k > 0)
        return n * my_pow(n, k - 1);
    else 
        return 1.0 / (my_pow(n, -k));
}
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    double ret = my_pow(n,k);
    printf("%lf",ret);
}

第9题(编程题)斐波那契数

第9题(编程题) 题目名称: 计算斐波那契数 题目内容: 递归和递归分别求第n个斐波那契数 如: 输入:5 输出:5 输入:10 输出:55 输入:2 输出:1

#include<stdio.h>
int Fib(int n)
{
    int a = 1,b = 1;
    if(n <= 2)
    {
        return 1;
    }
    for(int i = 3; i <= n; i++)
    {
        int t;
        t = a;
        a = a + b;
        b = t;
    }
    return a;
}
int main()
{
    int n;
    scanf("%d",&n);
    int ret = Fib(n);
    printf("%d",ret);
    return 0;
}//非递归函数
#include<stdio.h>
int Fib(int n)
{
    if(n == 1||n == 2)
        return 1;
    else
        return Fib(n - 1) + Fib(n - 2);
}
int main()
{
    int n;
    scanf("%d",&n);
    int ret = Fib(n);
    printf("%d",ret);
    return 0;
}//递归函数

  • 18
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Williamtym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值