#include using namespace std; typedef long long LL; //是否已经出现过非零数字 bool flag = false; //数位分离递归版本[朴素版本] void inv0(int n) { //递归出口为当前数字n=0 if (n == 0) { printf("\n"); return; } //当前位数字 int m = n % 10; printf("%d", m); //递归 inv0(n / 10); } //数位分离递归版本[朴素版本+标志优化] void inv1(int n) { //递归出口为当前数字n=0 if (n == 0) { printf("\n"); return; } //当前位数字 int m = n % 10; if (!flag && !m) {//没有出现过非零数字,并且,当前的数字还是0,也是不输出的 } else {//其它情况都应该输出 printf("%d", m); flag = true;//修改标识 } //等价变形 /*if(flag || m){ printf("%d", m); flag = true;//修改标识 }*/ //不管当前位置数字什么情况,都要尝试下一个位置递归 inv1(n / 10); } //最大公约数 int gcd(int a, int b) { if (!b) return a; return gcd(b, a % b); } //斐波那契数列[画二叉树说明] LL fib(int n) { if (n == 1) return 1; if (n == 2) return 1; return fib(n - 1) + fib(n - 2); } //斐波那契记化搜索+递归版本 const int N = 110; int s[N]; LL fib2(int n) { if (n == 1) return 1; if (n == 2) return 1; if (!s[n - 1]) s[n - 1] = fib2(n - 1); if (!s[n - 2]) s[n - 2] = fib2(n - 2); return s[n - 1] + s[n - 2]; } int main() { //朴素版本 inv0(100); inv0(12340567); //朴素版本+标志优化 inv1(100); inv1(12340567); //测试最大公约数 cout << gcd(4, 6) << endl; //测试斐波那契数列 cout << fib(20) << endl; //测试斐波那契数列(记忆化搜索+递归版本) cout << fib2(20) << endl; return 0; }