关于函数递归的一些总结
核心思想便是找到解决问题时出现的相似的步骤,用递归的思想去解决问题,
递归的过程就像是将大的问题分解为小的,一步步类似的问题,交给电脑去递归。
题目
1.更相减损术
2小q的数列
3The Biggest Water Problem
4.下台阶问题
5.汉诺塔问题,以及用二进制的思想解决汉诺塔问题
最简单的函数递归的例子便是算n的阶乘:
int factorial(int x) //这样一个简单的函数便能帮助我们求x的阶乘。
{
if(x==1) return 1; //边界条件:阻止函数无限递归下去
return x*factorial(x-1); //递归调用
}
然后便是下台阶问题, 一共有n级台阶,每次可以选择下一级或是两级,一共有多少种走法?
解决问题的核心便是将问题拆分成可循环的一个个小问题,思考第一步怎么走,第一步可以选择下一级,也可以选择下两级,那么走n级台阶的问题会被拆分成走(n-1)级台阶和走(n-2)级台阶走法和的问题
类似的走(n-1)级台阶也会被拆成(n-2)和(n-3)的走法和,于是我们就得到了递归调用的部分
return f(n-1) + f(n-2);
为了阻止函数无限调用下去,边界条件应设为
if(n==1) return 1;
if(n==2) return 2;
于是完整代码
int int f(int n)
{
if(n==1) return 1;
if(n==2) return 2;
return f(n-1) + f(n-2);
}
更相减损术
#include<bits/stdc++.h>
using namespace std;
long long yue( long long n1, long long n2)
{
n1 = n1-n2;
if(n1==n2 || n1==1) return n1;
return yue(max(n1,n2),min(n1,n2));
}
int main()
{
long long n1, n2;
cin >> n1 >> n2;
cout << yue(max(n1,n2),min(n1,n2));
return 0;
}
小q的数列
记得用long long,并且最后输出是找规律
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
long long get_(long long n)
{
if(n==1) return 1;
if(n==0) return 0;
if(n>=2) return get_(n/2)+get_(n%2);
return 0;
}
long long find_(long long n, long long t)
{
for( long long i=1; i<=t; i++)
{
if( get_(i)==n)
return i;
}
return 0;
}
int main()
{
long long t;
cin >> t;
for( long long i=1; i<=t; i++ )
{
long long n;
cin >> n;
cout << get_(n) << " " << (long long)(pow(2,get_(n))-1) << endl;
}
return 0;
}