之前我们学习了函数,现在我们来总结一下函数中的函数递归,而实现求n的阶乘,顺序打印⼀个整数的每⼀位,第n个斐波那契数的实现等这些代码就需要用到函数递归来实现。
一.什么是递归
递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。(让函数在运行中不断的调用本身这个函数,达成另类的“循环”)。
#include <stdio.h>
递归的思想:
把⼀个⼤型复杂问题层层转化为⼀个与原问题相似,但规模较⼩的⼦问题来求解;直到⼦问题不能再 被拆分,递归就结束了。所以递归的思考⽅式就是把⼤事化⼩的过程。(个人理解为不断拆分一个问题。) 递归中的递就是递推的意思,归就是回归的意思。
首先通过上面可以知道n的阶乘的公式是 n = n ∗ (n − 1)
然后我们就可以来拆分问题,用递归思想来解决:
代码如下:
//递归实现求n的阶乘
int factorial(int n) {
if (n <= 0) {
return 1;
}
else {
return n * factorial(n - 1);
}
}
//非递归实现求n的阶乘
int factorial1(int n) {
int i = 1;
int j = 1;
for (i = 1; i <= n; i++) {
j *= i;
}
return j;
}
int main() {
int n = 0;
scanf("%d", &n);
int m = factorial1(n);
printf("%d \n", m);
return 0;
}
四.顺序打印⼀个整数的每⼀位
void Digit(int n) {
if (n > 9)
{
Digit(n / 10);
}
printf("%d ", n % 10);
}
int main() {
int n = 0;
printf("请输入一个非负整数:\n");
scanf("%d", &n);
Digit(n);
return 0;
}
//计算一个数的每位之和(递归实现)
int DigitSum(int n) {
if (n > 9)
{
return DigitSum(n / 10) + n % 10;
}
else {
return n;
}
}
int main() {
int n = 0;
printf("请输入一个非负整数:\n");
scanf("%d", &n);
int sum=DigitSum(n);
printf("%d \n", sum);
return 0;
}
代码如下:
//递归和实现求第n个斐波那契数
int fbnq(int n) {
if (n<=2) {
return 1;
}
else {
return fbnq(n - 1) + fbnq(n - 2);
}
}
//非递归实现求第n个斐波那契数
int fbnq1(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;
scanf("%d",&n);
int a = fbnq1(n);
printf("%d ", a);
return 0;
}