休息时间: #include <iostream> using namespace std; int main(){ int h,m,s; int k; cin>>h>>m>>s>>k; s+=k;//如果s>=60换算成分钟 m+=s/60;//如果m>=60换算成小时 s%=60;//剩下的秒数 h+=m/60; m%=60;//剩下的分钟 cout<<h<<" "<<m<<" "<<s; return 0; } 递归函数: 方案一:正向推导(斐波那契数列) 1、列出递进关系的数据:找到规律 n=1,f(n)=1 n=2,f(n)=1 n=3,f(n)=2 n=4,f(n)=3 n=5,f(n)=5 n=6,f(n)=8 n=7,f(n)=13 -> 前面一个和前面第二个相加 通常,列出的递进关系超过15个,仍然没找出来规律,就战略放弃 2、将规律总结成递进关系公式:f(n)和f(n-k)之间的关系 这里:f(n)=f(n-1)+f(n-2) 3、将不符合公式的数据找出来 n=1,f(n)=1 n=2,f(n)=1 相当于递归的结束条件 4、写代码 int f(int n){ if(n==1||n==2) return 1; return f(n-1)+f(n-2); } 正向推导:1166 1、列数据 x,n=1,f(x,n)=sqrt(1+x) x,n=2,f(x,n)=sqrt(2+sqrt(1+x)) x,n=3,f(x,n)=sqrt(3+sqrt(2+sqrt(1+x))) x,n=4,f(x,n)=sqrt(4+sqrt(3+sqrt(2+sqrt(1+x)))) x,n=5,f(x,n)=sqrt(5+sqrt(4+sqrt(3+sqrt(2+sqrt(1+x))))) 2、规律 f(x,n)=sqrt(n+f(x,n-1)) 3、结束条件 x,n=1,f(x,n)=sqrt(1+x) 4、写代码 double f(double x,int n){ if(n==1) return sqrt(1+x); return sqrt(n+f(x,n-1)); } 逆向思考:爬楼梯 一共有n级楼梯,每次只能爬1级或2级,一共有多少种爬法 n=5 11111 1112 1121 1211 2111 122 212 221 一共有8种 数据量太大,不好列出来 如果,设n级楼梯一共有f(n)种爬法 那么,最后一次爬楼梯的时候可能迈几级楼梯:1或2级 如果最后一次爬1级,那么就有f(n-1)种爬法 如果最后一次爬2级,那么就有f(n-2)种爬法 所以f(n)=f(n-1)+f(n-2) 类似的问题还有汉诺塔、全排列 正向推导适合数据量小,规律明显的题目 逆向思考适合数据不明显,且题目相对复杂的情况 作业:1159,1166,1167+额外11道题 49->63->77->91 (责任编辑:admin) |