简单来说函数递归就是函数自己调用自己,演示一下
#include <stdio.h>
int main()
{
printf("hehe\n");
main();//main函数中⼜调⽤了main函数
return 0;
}
这个代码会陷入死递归,致使栈溢出,只作演示帮助理解什么是函数递归。
一、递归的限制条件
递归在书写的时候,有2个必要条件:
(1)递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
(2)每次递归调用之后越来越接近这个限制条件。
二、递归举例
1、求n的阶乘
n的阶乘就是n*(n-1)*(n-2)*.....*1,可以定义一个函数fact,将n递减,如果n不为0,那么就返回n*fact(n-1),如果n等于0,那么就返回1,就可以有
#include <stdio.h>
int Fact(int n)
{
if(n==0)
return 1;
else
return n*Fact(n-1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fact(n);
printf("%d\n", ret);
return 0;
}
2、顺序打印⼀个整数的每⼀位
比如 输入:1234 输出:1 2 3 4.
对于这类题目首先要想到n%10得到末位数,n/10得到除去个位数的新数,然后再进行n%10,如此循环下去,但这打印出来的结果是倒序的,如果想要正序打印出来,就要先判断这个数是否大于9,如果大于9那么就递归n/10,并且要打印出n%10,并且打印要在递归条件之后这样才会是正序打印,就可以
void Print(int n)
{
if(n>9)
{
Print(n/10);
}
printf("%d ", n%10);
}
int main()
{
int m = 0;
scanf("%d", &m);
Print(m);
return 0;
}
三、递归与迭代
递归和迭代各有利弊,在分析编程题目时,更容易想出递归的方法,而且描述简洁,但是递归会占用更多内存空间,有可能栈溢出,使性能下降;那么如果不想用递归,就可以用迭代的方法(就是循环),提高效率。
比如要求第n个斐波那契数,用递归的方法,代码如下:
#include<stdio.h
int Fib(int n)
{
if(n <= 2)
return 1;
else
return Fib(n-1) + Fib(n-2);
}
int main()
{
int n=0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}
其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计 算,而且递归层次越深,冗余计算就会越多。而如果使用迭代的方法,代码可以这样:
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while(n>2)
{
c = a+b;
a = b;
b = c;
n--;
}
return c;
}
迭代的方式去实现这个代码,效率就要⾼出很多了。