递归学习博客:博客地址
1.递归实现指数函数
double calc_pow( double x, int n ){
//1.确定退出条件
//2.找等价关系式
if(n==1){
return x;
}
return x*calc_pow(x,n-1);
}
2.递归计算Ackermenn函数
int Ack( int m, int n ){
//1.确定退出条件
//2.确定关系式
if(m==0){
return n+1;
}
if(n==0&&m>0){
return Ack(m-1,1);
}
if(m>0&&n>0){
return Ack(m-1,Ack(m,n-1));
}
}
3.递归实现顺序输出整数
void printdigits( int n ){
//1.确定函数要干嘛--输出整数,且按位输出
//2.确定终止条件,只剩最后一个位的时候
//3.递归关系式 n>9 输出n%10,n=n/10
if(n<10){
printf("%d\n",n);
}
if(n>=10){
//printf("%d\n",n%10);在递归之前就输出的话,会从低位开始输出
printdigits(n/10);
printf("%d\n",n%10);
}
}
4.递归求阶乘和
double fact( int n ){
//1.确定函数要干嘛--求阶乘
//2.确定终止条件,n<=2
//3.递归关系式 n*f(n-1)
if(n<=1){
return 1;
}
return n*fact(n-1);
}
double factsum( int n ){
//1.确定函数要干嘛--阶乘加和
//2.确定终止条件,n=1
//3.递归关系式 factsum(fact(n))
//fact(n)+factsum(n-1);
if(n==1){
return 1;
}
double sum=0.0;
for(int i=1;i<=n;i++){
sum+=fact(i);
}
return sum;
}
5.递归求简单交错幂级数的部分和
double fn( double x, int n ){
//1.确定函数要干嘛--求部分和
//2.确定终止条件,n=1 加x
//3.递归关系式
if(n==1){
return x;
}
return pow(-1,n-1)*pow(x,n)+fn(x,n-1);
}
6.递归求Fabonacci数列
int f(int n){
//1.确定函数要干嘛--求fb数列
//2.确定终止条件,n=0 n=1
//3.递归关系式
if(n==0 || n==1){
return n;
}
return f(n-2)+f(n-1);
}
7.LeetCode50:Pow(x, n)
//只能过291 / 306 个通过的测试用例,要是全过得考虑降幂,直接累乘会溢出
double myPow(double x, long long n) {
if(n==1){
return x;
}
if(n==0&&x!=0){
return 1;
}
if(n==-1){
return 1/x;
}
if(n<-1){
long long m=0-n;
return (1/x)*myPow(1/x,m-1);
}
//n>1的情况
return x*myPow(x,n-1);
}
8.LeetCode231:2的幂
bool isPowerOfTwo(int n) {
//1.确定函数要干嘛--判断是不是2的幂
//2.确定终止条件,n=2
//3.递归关系式
if (n < 1) return false;
if(n!=1 && n%2==1){
return false;
}
if(n==2 || n==1){
return true;
}
return isPowerOfTwo(n/2);
}
9.LeetCode326:3的幂
bool isPowerOfThree(int n) {
if(n==3 || n==1){
return true;
}
if(n<1){
return false;
}
if(n!=1 && n%3!=0){
return false;
}
return isPowerOfThree(n/3);
}
//判断是不是4的幂也类似 代码如下
bool isPowerOfFour(int n) {
if(n<1){
return false;
}
if(n==4 || n==1){
return true;
}
if(n%4!=0 && n!=1){ //直接排除了一些连4都不能整除的数
return false;
}
return isPowerOfFour(n/4);
}