欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class10 lcy 递归解法

时间:2024-07-08 09:02 作者:admin 点击:
休息时间: #include iostream using namespace std; int main(){ int h,m,s; int k; cinhmsk; s+=k;//如果s=60换算成分钟 m+=s/60;//如果m=60换算成小时 s%=60;//剩下的秒数 h+=m/60; m%=60;//剩下的分钟 couth" "m" "s; retur

休息时间:


#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)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%