函数递归
1)什么是递归?
程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过 程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一 个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复 计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小,所以很多的问题我们用递归来解决会方便许多.
2)递归的两个必要条件
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续.
2.每次递归调用之后越来越接近这个限制条件。
下面我们通过一些练习题来深刻理解一下递归
1.递归和非递归分别实现求第n个斐波那契数。
2.编写一个函数实现n^k,使用递归实现
3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
4. 编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。
5.递归和非递归分别实现strlen
6.递归和非递归分别实现求n的阶乘
7.递归方式实现打印一个整数的每一位
上面的题目虽然不一样,但是也都是用了递归的方法,不是很难,大同小异.
代码如下:
1.递归和非递归分别实现求第n个斐波那契数。
//递归
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int fib(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
return fib(n - 1) + fib(n - 2);
}
int main()
{
int n = 0;
printf("输入要求的斐波那契数的序号:");
scanf("%d", &n);
int t = fib(n);
printf("%d\n", t);
system("pause");
return 0;
}
//非递归
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int fib(int n)
{
int value = 0;
int f1 = 1;
int f2 = 1;
for (int i = 2; i < n; ++i)
{
value = f1 + f2;
f2 = f1;
f1 = value;
}
return value;
}
int main()
{
int n = 0;
printf("输入要求的斐波那契数的序号:");
scanf("%d", &n);
int t = fib(n);
printf("%d\n", t);
system("pause");
return 0;
}
2.编写一个函数实现n^k,使用递归实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int value(int n, int k)
{
if (k == 0)
{
return 1;
}
return n * value(n, k - 1);
}
int main()
{
int n = 0;
int k;
printf("请输入你要计算的数以及要计算的次方数:");
scanf("%d %d", &n, &k);
int t = value(n,k);
printf("%d的%d次方为:%d", n, k, t);
system("pause");
return 0;
}
这道题我加了一个k来计算循环的次数,因为n是不能变的,所以得重新给一个变量去算次数.
3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int DigitSum(int n)
{
if ((n / 10) == 0)
{
return n;
}
return (n % 10) + DigitSum(n / 10);
}
int main()
{
int n = 0;
printf("输入一个非负数求它的各个位的数字之和:");
scanf("%d", &n);
int t = DigitSum(n);
printf("value is %d\n", t);
system("pause");
return 0;
}
4. 编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void reverse_string(char * string)
{
if (*string != '\0')
{
string++;
reverse_string(string);
printf("%c",*(string - 1));
}
}
int main()
{
char str[15] = "qwertyuiop";
printf("原字符串为:%s\n",str);
printf("反向排列后为:");
reverse_string(str);
printf("\n");
system("pause");
return 0;
}
5.递归和非递归分别实现strlen
//递归
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int cstrlen(char *str)
{
if (*str == '\0')
{
return 0;
}
return 1 + cstrlen(str + 1);
}
int main()
{
char str[10] = {0};
printf("请输入一个字符串:");
scanf("%s",str);
printf("字符串大小为:%d\n", cstrlen(str));
system("pause");
return 0;
}
//非递归
#include <stdio.h>
#include <stdlib.h>
int cstrlen(char *str)
{
int count = 0;
while(*str != '\0')
{
++count;
++str;
}
return count;
}
int main()
{
char *str = "qwertyuiop";
int t = cstrlen(str);
printf("长度为:%d\n", t);
system("pause");
return 0;
}
6.递归和非递归分别实现求n的阶乘
//递归
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int value(int n)
{
if (n == 1)
{
return 1;
}
return n * value(n - 1);
}
int main()
{
int n = 0;
printf("请输入一个数来计算它的阶乘:");
scanf("%d", &n);
printf("阶乘为:%d\n", value(n));
system("pause");
return 0;
}
//非递归
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int value(int n)
{
int count = 1;
while (n > 0)
{
count = count * n;
--n;
}
return count;
}
int main()
{
int n = 0;
printf("请输入一个数来计算它的阶乘:");
scanf("%d", &n);
printf("阶乘为:%d\n", value(n));
system("pause");
return 0;
}
7.递归方式实现打印一个整数的每一位
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void display(int n)
{
if(n > 9)
{
display(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int n = 0;
printf("请输入一个整数打印它的每一位:");
scanf("%d", &n);
display(n);
system("pause");
return 0;
}
以上就是递归的一些基本的题型,递归说难不难,说简单也不简单,它在C语言中有着很重要的地位,所以还是建议要深刻的理解递归调用.