第1章递归函数

第1章 递归函数的设计技巧

  • 数学归纳法

  • 递归函数设计三个重要部分

  • 递归求阶乘

数学(结构)归纳法
  1. 验证P(1)成立
  2. 证明如果P(k)成立,那么P(k+1)成立
  3. 联合Step1和Step2,证明P(1)->P(n)成立
递归函数
  1. 给递归函数一个明确的语义
  2. 实现边界条件时的程序逻辑(p(1))
  3. 假设递归函数调用返回结果是正确的,实现本层函数逻辑 ( p(k) )
//递归 n的阶乘
//1.acm_1_1_diGui_test6代表n的阶乘的结果
int acm_1_1_diGui_test(int n){if(n==1)return 1; //边界条件 n==1return acm_1_1_diGui_test(n-1)*n; //利用f(n-1)结果计算f(n)的值
}//猴子吃桃
//猴子吃n天桃子的数量
int acm_1_1_diGui_test2(int n){if(n==1)return 1;return (acm_1_1_diGui_test2(n-1)+1)*2;
}

例题

一个小球,掉落到一连串弹簧板上,每个弹簧板回弹a[i]个距离,问小球弹 几次会弹出弹簧板串

5

2 2 3 1 2

2表示会弹2个距离,所以是2+3==5 ,

到三会弹3个距离,5+3=8>5

所以弹了两次

  1. f(i)小球从i位置开始被弹出的次数
  2. i>=n 时结束
  3. f(i)=f(i+a[i])+1
i=0
res=0
n=int(input())
ns=list(map(int,input().split(" ")))
while(i<n):i+=ns[i]res+=1
print(res)

例题:

输出n的指数型枚举

in:

3

out:

1
1 2
1 2 3
1 3
2
2 3
3

分析:

f(i,j,n) ,i表示第i个位置,j表示最小,n表示最大

边界条件是j>n ,最小值比最大值大的时候

  1. 如何按照字典序输出?

从小到大进行枚举每个位置的数字就是字典序

  1. 如何保证每个位置数字都大于前面的数字?

传入一个量,标记当前位置的最小值

每个枚举的过程都传入另一个数字,这个数字他标记了当前位置最小可以选取的数字

  1. 如何输出?
int arr[10]; 
def fn(int i,int j,int n){if (j>n) return;for(int k=j;k<=n;k++){ //j代表最小值,只能输出从j到narr[i]=k;//i代表第几个位置, 其中arr[j]一定比arr[i]前面的都大print_one_result(i); //输出前i个,i表示到了第几个位置fn(i+1,j+1,n); }
}//输出从arr数组从0到n的元素
void print_one_result(int n){cout << "n" << n << endl;for(int i=0;i<=n;i++){if(i){cout << " ";}cout << arr[i];}cout << endl;
}
int n;
cin >> n; //对n进行指数枚举
acm_1_1_diGui_fn3(0,1,n);
f(n)的n==ikarrji
01110
121 221
231 2 332
131 321
02210
132 331
03310

结论:

i==n为输出的个数

k为最后一个元素值

结束条件:j用来限定输出最小值,j永远不超过3

因为是递归,所以看k的值可以看出来属于哪一层递归

1

​ 2 3

​ 3

2

​ 3

3

arr=[0]*10
def print_one_result(n):for i in range(0,n+1):if i:print(" ",end="")print(arr[i],end="")print()def fn3(i,j,n):if(j>n): return;for k in range(j,n+1):arr[i]=kprint_one_result(i)fn3(i+1,k+1,n);def fn3_Test():n=int(input())fn3(0,1,n)
fn3_Test()

例题:

递归实现组合型枚举

in:

3 2

out:

1 2

1 3

2 3

  1. 如何按照字典序输出所有方案?

枚举每个位置直接从小到大

  1. 当前位置可以选取的最小值是什么–设置变量

  2. 怎么输出?

if i ==m,就

f(i,j,n) 第i个位置的最小值j和最大值n

边界是是否有足够多数

void acm_1_1_print_one_result5(int n){for(int i=0;i<n;i++){if (i) cout << " ";cout << arr[i];}cout << endl;
}
void acm_1_1_diGui_fn5(int i,int j,int n,int m){if(i==m){acm_1_1_print_one_result5(m);return;}for(int k=j;k<=n && m-i-1<=n-k;k++){arr[i]=k;acm_1_1_diGui_fn5(i+1,k+1,n,m);}return;
}
void acm_1_1_diGui_test5(){int n,m; //n代表输入是几 ,m代表每次输出几个数cin >> n >> m;acm_1_1_diGui_fn5(0,1,n,m);//0 代表第几个位置//1 代表当前位置最小可以选择的值//n 代表当前位置最大可以选择的值//m 最多枚举多少倍
}

例题:

按照字典序列,输出所有1到n这n个整数的所有方案

  1. 递归函数长什么样?----f(i,n)
  2. i==n的时候-》返回输出
//按照字典序输出所有1到n这n个整数的方案
int arr6[10],vis6[10]={0};
void acm_1_1_print_one_result6(int n){for(int i=0;i<n;i++){if(i) cout << " ";cout << arr6[i];}cout << endl;return;
}
void acm_1_1_diGui_fn6(int i,int n){if(i==n){//开始输出acm_1_1_print_one_result6(n);return;}for(int k=1;k<=n;k++){if(vis6[k])continue; //k被使用过了arr6[i]=k;vis6[k]=1;acm_1_1_diGui_fn6(i+1,n);vis6[k]=0; //回收k}
}
void acm_1_1_diGui_test6(){int n; //n代表输入是几 ,m代表每次输出几个数cin >> n;acm_1_1_diGui_fn6(0,n);//0 代表第几个位置//1 代表当前位置最小可以选择的值//n 代表当前位置最大可以选择的值//m 最多枚举多少倍
}
acm_1_1_diGui_test6();

例题:

239不规则的街道

​ 分形系统:

同样的一个图形通过固定的变换到一个更大的图形,-继续更大的图形

//分形图形
void acm_1_1_diGui_fn7(long long n,long long s,long long &x,long long &y){//递归函数,求n级城市中,房子编号为s的房子坐标并将坐标存储在(x,y)变量中if(n==1){//当为1级城市的时候,直接返回if (s==1) x=0,y=0;else if(s==2) x=0,y=1;else if(s==3) x=1,y=1;else x=1,y=0;return;}long long L=1LL << (n-1);long long block=L*L; //每个区域点的数量long long xx,yy;//当前点在第几个区域中if (s <= block ) { //第一个区域,用坐标变换规则:(x,y)->(y,x)acm_1_1_diGui_fn7(n-1,s,xx,yy);x=yy,y=xx;}else if(s <= 2*block){ //第二个区域,(x,y)->(x,y+L)acm_1_1_diGui_fn7(n-1,s-block,xx,yy);x=xx,y=yy+L;}else if(s <= 3*block){ //第三个区域,(x,y)->(x+L,y+L)acm_1_1_diGui_fn7(n-1,s-2*block,xx,yy);x=xx+L,y=yy+L;}else{//第四个区域,(x,y)->(2L-y-1 ,L-x-1)acm_1_1_diGui_fn7(n-1,s-3*block,xx,yy);x=2*L-yy-1,y=L-xx-1;}return;}
void acm_1_1_diGui_test7(){long long t,n,s,d;scanf("%lld",&t);while(t--){scanf("%lld%lld%lld",&n,&s,&d);long long sx,sy,dx,dy;acm_1_1_diGui_fn7(n,s,sx,sy);acm_1_1_diGui_fn7(n,d,dx,dy);printf("%.0lf\n",10*sqrt(S(sx-dx)+S(sy-dy)));}
}
void acm_1_1_diGui_test7(){long long t,n,s,d;scanf("%lld",&t);while(t--){scanf("%lld%lld%lld",&n,&s,&d);long long sx,sy,dx,dy;acm_1_1_diGui_fn7(n,s,sx,sy);acm_1_1_diGui_fn7(n,d,dx,dy);printf("%.0lf\n",10*sqrt(S(sx-dx)+S(sy-dy)));}
}
  • 完成2024.3.5
by cry

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++入门 (1) >>命名空间与缺省参数

1. c与c语言的区别 c兼容c语言90&#xff05;以上的语法与规则&#xff0c;c语言相当于用锤子和凿子制作工艺品&#xff0c;c相当于用电钻&#xff0c;电动雕刻刀制作工艺品。 2. c的框架 #include<iostream> //stdio.h的升级版 using namespace std; //展开命…

项目搭建之统一返回值

自定义枚举类 Getter public enum ReturnCodeEnum {/*** 操作失败**/RC999("999","操作XXX失败"),/*** 操作成功**/RC200("200","success"),/*** 服务降级**/RC201("201","服务开启降级保护,请稍后再试!"),/*** …

【笔记】Python学习记录

Python学习记录 Hello World变量简单数据类型字符串大小写转换插入变量Tab和Enter删除前后空格删除前后缀 Hello World 老调调了&#xff0c;如何在终端输出信息呢&#xff1f; print("Hello World")Hello World变量 变量命名遵从代码变量命名通则&#xff0c;几乎…

3.27作业

1、完成下面类 #include <iostream> #include <cstring> using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10){str new char[size]; …

php魔术方法

PHP 中的魔术方法&#xff08;Magic Methods&#xff09;是一组具有特殊名称的方法&#xff0c;它们会在特定的事件发生时自动被调用。这些事件包括对象的创建、销毁、属性的访问和修改等。通过使用魔术方法&#xff0c;你可以更好地控制对象的行为&#xff0c;并增加代码的灵活…

计算机网络安全 —— 非对称加密算法 RSA 和数字签名

一、非对称加密算法基本概念 ​ 在对称密钥系统中&#xff0c;两个参与者要共享同一个秘密密钥。但怎样才能做到这一点呢&#xff1f;一种是事先约定&#xff0c;另一种是用信使来传送。在高度自动化的大型计算机网络中&#xff0c;用信使来传送密钥显然是不合适的。如果事先约…

【动态规划】【卡特兰数】Leetcode 96. 不同的二叉搜索树

【动态规划】【卡特兰数】Leetcode 96. 不同的二叉搜索树 动态规划卡特兰数 ---------------&#x1f388;&#x1f388;96. 不同的二叉搜索树 题目链接&#x1f388;&#x1f388;------------------- 动态规划 &#x1f612;: 我的代码实现> 动规五部曲 ✒️确定dp数组…

Impala中操作Kudu表的语法

文章目录 前言一、相关介绍1. 内部表和外部表1.1 内部表1.2 外部表 2. 分区表 二、Impala中操作Kudu表的语法1. 创建Kudu外部表2. 创建Kudu内部表2.1 CTAS&#xff08;CREATE TABLE AS SELECT&#xff09;2.2 创建范围分区表2.3 创建哈希分区表2.4 同时使用范围分区和哈希分区2…

Palindromes(回文、镜像字符串)

描述 A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDEDCBA" is a palindrome because it is the same when the string is read from left to right as when the string is read fr…

linux命令在线查询工具

您提供的链接是一个名为“Linux 命令在线查询工具 - 轻松查找命令信息”的在线工具页面。这个工具旨在帮助用户快速查找和了解Linux命令的详细信息&#xff0c;从而提高工作效率。 工具概述 Linux命令在线查询工具是一个便捷的资源&#xff0c;它允许用户通过简单的搜索功能来…

dfs (蓝桥备赛)

1、 1317&#xff1a;【例5.2】组合的输出 时间限制: 1000 ms 内存限制: 65536 KB 提交数:52237 通过数: 26231 【题目描述】 排列与组合是常用的数学方法&#xff0c;其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n)&#xff0c;我们可以简单地将n个元素理解…

SpringMvc之映射器HandlerMapping

简介 在springmvc的处理流程中&#xff0c;第一步就是查询请求对应的映射器&#xff0c;然后组装成处理器链处理请求&#xff0c;本文意在梳理该过程 重要实现 HandlerMapping是一个接口&#xff0c;该接口用于通过HttpServletRequest寻找对应的处理器&#xff0c;接口介绍如下…

攻防世界逆向刷题

阅读须知&#xff1a; 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者 本人负责&#xff0c;作者不为此承担任何责任,如…

数据库 表数据添加分页查询 --Java实现

分页数据实体类 public class PageBean implements Serializable {private int rowsPerPage 15;private int rowsNum;//行数private int maxPage;//页数private int pageNum;//页码 } Emp实体类 Data public class Emp implements Serializable {private Long id;private S…

大三实习小菜蛋之JS元素节点

元素节点对象&#xff08;element&#xff09; -在网页中&#xff0c;每一个标签就是一个节点元素 如何获取元素节点对象 1.通过document对象来获取元素节点 2.通过document对象来创建元素节点 通过document来获取已有的元素节点 document.getElementById()-根据id获取一个…

使用`scipy.stats.wasserstein_distance`来计算两个一维分布之间的Earth Mover‘s Distance (EMD)距离

在Python中&#xff0c;计算Earth Mover’s Distance (EMD)通常使用scipy库中的scipy.stats.wasserstein_distance函数&#xff0c;该函数计算的是Wasserstein距离&#xff0c;它与EMD非常相似&#xff0c;都是用来衡量两个分布之间的距离。 以下是一个简单的Python程序例子&a…

超好用的快捷回复软件

随着直播经济和短视频平台的兴起&#xff0c;品牌营销阵地不再局限于传统的电商巨头——淘宝、天猫、京东和拼多多&#xff0c;越来越多的品牌正积极布局快手、抖音等新晋电商平台&#xff0c;同步打造社群矩阵以拓宽产品推广渠道。这种多维度的市场渗透策略有力地提升了品牌的…

C语言看完我这篇编译与链接就够啦!!!

1. 前言 Hello&#xff01;大家好我是小陈&#xff0c;今天来给大家介绍最详细的C语言编译与链接。 2. 编译和链接 我们通常用的编译器&#xff0c;比如Visual Sudio,这样的IDE(集成开发环境&#xff09;一般将编译和链接的过程一步完成&#xff0c;通常将这这种编译和链接合…

算法(6)KMP+trie

KMP&#xff1a; 最浅显易懂的 KMP 算法讲解_哔哩哔哩_bilibili 该视频使用python书写代码&#xff0c;不会python的小伙伴也可以看看了解kmp的大致思路。 问题描述&#xff1a; kmp&#xff1a;字符串匹配算法&#xff0c;用来找一个长字符串中出现了几次小字符串&#xf…

random模块篇

Python 的 random 模块是一个非常实用的工具&#xff0c;它提供了生成各种类型随机数的方法。无论是生成随机整数、浮点数&#xff0c;还是从序列中随机选择元素&#xff0c;random 模块都能满足你的需求。下面是一个详细的教程&#xff0c;介绍 random 模块的主要功能和用法。…