一. 什么是递归?
所谓递归,说白了就是函数自己调自己(但不是简单的自己调自己!),一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
—————————————————————————————————————
二. 递归的两个必要条件
1. 存在 限制条件 ,当满足这个限制条件的时候,递归便不再继续 。
2.每次递归调用之后会越来越接近这个 限制条件 。
—————————————————————————————————————
三. 满足两个必要条件时,递归一定就没问题?(以下代码,两个条件都满足,但是会栈溢出!)
void test ( int n) {
if ( n< 10000 ) {
test ( n + 1 ) ;
}
}
int main ( ) {
test ( 1 ) ;
return 0 ;
}
递归可以用来解决:汉诺塔,阶乘等问题~
求n的阶乘,代码实现。
int Facl ( int n) {
if ( n<= 1 ) {
return 1 ;
} else {
return n * Facl ( n- 1 ) ;
}
}
int main ( ) {
int n = 0 ;
int ret = 0 ;
scanf ( "%d" , & n) ;
ret = Facl ( n) ;
printf ( "%d" , ret) ;
return 0 ;
}
用递归求第n的斐波那契数列(真的好吗?)
当我们求前几个的时候,计算机很快就帮算出了结果,那你试试45以后的数,是不是就计算机就算得特别慢。所以不要用递归去解决斐波那契数列问题。
int Fib ( int n) {
if ( n== 1 || n== 2 ) {
return 1 ;
} else {
return Fib ( n- 1 ) + Fei ( n- 2 ) ;
}
}
int main ( ) {
int n = 0 ;
int ret = 0 ;
scanf ( "%d" , & n) ;
ret = Fib ( n) ;
printf ( "%d" , ret) ;
return 0 ;
}