递归的两个必要条件
1.不能死递归,要有跳出条件,且每次递归要逼近跳出条件
2.递归层次不能太深,不然会出现栈溢出
满足条件1,不满足条件2的情况
void test(int n)
{
if (n < 10000)
{
test(n + 1);
}
}
int main()
{
int a = 10;
test(1);
return 0;
}
递归的常见题目
1.求n的阶乘
#include "stdio.h"
#include "string.h"
//使用递归
int factorial1(int n){
if(n == 1){
return 1;
} else{
return n * factorial1(n-1);
}
}
//使用迭代
int factorial2(int n){
int result = 1;
while(n>0){
result *= n;
n--;
}
return result;
}
int main(){
int n = 0;
scanf("%d", &n);
printf("使用递归:%d\n", factorial1(n));
printf("使用迭代:%d\n", factorial2(n));
return 0;
}
2.求第n个斐波那契数
#include "stdio.h"
#include "string.h"
//使用递归
int fib1(int n){
if(n <= 2) {
return 1;
} else{
return fib1(n-1) + fib1(n-2);
}
}
//使用迭代
int fib2(int n){
int result = 1;
int pre_1 = 1;
int pre_2 = 1;
while (n > 2){
n--;
result = pre_1 + pre_2;
pre_1 = pre_2;
pre_2 = result;
}
return result;
}
int main(){
int n = 0;
scanf("%d", &n);
printf("使用递归:%d\n", fib1(n));
printf("使用迭代:%d\n", fib2(n));
return 0;
}
3.求n的k次方(含负数)
#include "stdio.h"
#include "string.h"
double my_pow(int n, int k){
if(0 == k){
return 1;
} else if(k > 0){
return n * my_pow(n, k-1);
} else{
return (1.0)/my_pow(n,-k);
}
}
int main(){
int n = 0;
int k = 0;
scanf("%d%d",&n,&k);
double result = my_pow(n, k);
printf("%.2llf\n", result);
return 0;
}
顺便再安利一个号称“程序员的知乎”的网站https://stackoverflow.com/