函数
目录
第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;
}//递归函数