【藍橋杯速成】| 4.遞歸

遞歸

?題目一:最大公約數

問題描述

1979. 找出數組的最大公約數 - 力扣(LeetCode)

給你一個整數數組?nums?,返回數組中最大數和最小數的?最大公約數?。

兩個數的?最大公約數?是能夠被兩個數整除的最大正整數。

解題步驟

需要返回數組中最大最小值的最大公約數

那么首先需要求出最大最小值

可以使用for循環遍歷得到

int minnum=INT_MAX,maxnum=INT_MIN;
for(int i=0;i<nums.size();i++){if(nums[i]<minnum){minnum=nums[i];}if(nums[i]>maxnum){maxnum=nums[i];}
}

當然也可以使用

求最大值和最小值的函數

  1. 最大值std::max_element

  2. 最小值std::min_element

這些函數返回的是指向最大值或最小值的迭代器,因此需要通過解引用操作符?*?來獲取具體的值。

int maxnum=*max_element(nums.begin(),nums.end());
int minnum=*min_element(nums.begin(),nums.end());

?接下來就是求最大公約數

根據數學知識,我們可以使用輾轉相除法

?那么很明顯這是個遞歸過程,每次要求的是較大值除以較小值的余數,

終止條件就是余數為零,代表整除

所以求最大公倍數的函數應該是

int GCD(int maxnum,int minnum){if(maxnum%minnum == 0)return minnum;else return GCD(minnum,maxnum%minnum);
}

?最后只需要在主函數中調用即可,完整代碼在下面!

補充說明:C++的標準庫中有計算兩個整數最大公約數的函數,就叫gcd,可以直接調用,但此處想強調的是最基礎的遞歸邏輯,故手動實現了一把!

code

class Solution {
public:int GCD(int maxnum,int minnum){if(maxnum%minnum == 0)return minnum;else return GCD(minnum,maxnum%minnum);}int findGCD(vector<int>& nums) {// int minnum=INT_MAX,maxnum=INT_MIN;// for(int i=0;i<nums.size();i++){//     if(nums[i]<minnum){//         minnum=nums[i];//     }//     if(nums[i]>maxnum){//         maxnum=nums[i];//     }// }int maxnum=*max_element(nums.begin(),nums.end());int minnum=*min_element(nums.begin(),nums.end());return GCD(maxnum,minnum);}
};


題目二:FJ的字符串

問題描述

FJ在沙盤上寫了這樣一些字符串:
  A1 = “A”
  A2 = “ABA”
  A3 = “ABACABA”
  A4 = “ABACABADABACABA”
  … …
  你能找出其中的規律并寫所有的數列AN嗎?

輸入格式

僅有一個數:N ≤ 26。

輸出格式

請輸出相應的字符串AN,以一個換行符結束。輸出中不得含有多余的空格或換行、回車符。

樣例輸入

3

樣例輸出

ABACABA

解題步驟

觀察這些字符串,不難發現

  A1 = “A
  A2 = “ABA
  A3 = “ABACABA
  A4 = “ABACABADABACABA

整體規律就是:AN=A(N-1)+第N號字母+A(N-1)

那么也可以用遞歸方法實現

直接利用找到的規律寫出代碼即可,注意字符轉化

code

#include<bits/stdc++.h>
using namespace std;
string FJ(int N){if(N==1){return "A";}else{return FJ(N-1)+(char)('A'+N-1)+FJ(N-1);}
}
int main(){int N;cin>>N;cout<<FJ(N);return 0;
} 

題目三:遞歸實現指數型枚舉

問題描述

從?1~n?這?n?個整數中隨機選取任意多個,輸出所有可能的選擇方案。

輸入格式

????????輸入一個整數n。

輸出格式

????????每行輸出一種方案。同一行內的數必須升序排列,相鄰兩個數用恰好1個空格隔開。對于沒有選任何數的方案,輸出空行。各行(不同方案)之間的順序任意。

數據范圍

????????1 ≤ n ≤ 15

示例

????????輸入 :3

????????輸出:1,12,13,123,2,23,3

????????輸入 :4

????????輸出:1,12,13,14, 123,134, 1234, 2,23,24, 234, 3, 34, 4

解題步驟

觀察題目和示例,可以看到這個n既是輸出的最大長度,也是所取數字的最大值

組合成的每一個數字實際上有重復關系,使用遞歸法

觀察輸出,實際上是對1~n中每個數字的選與不選

即取n時與取n-1時的區別在于增加了n這個數字所組成的組合(單層遞歸)

	dfs(index+1,n,current);//不選擇該數字 ,即n-1產生的所有答案current.push_back(index);//index加入該數字 dfs(index+1,n,current);//生成新的組合 

規定同一行的數必須升序排列,那么第一個元素的大小還決定了該行答案出現數字的下界,并且第一個元素是從1,2,3,,,n

那么遞歸的終止條件為

	if(index>n){for(int i=0;i<current.size();i++){cout<<current[i]<<" ";}cout<<endl;return;}

?dfs具備以上兩個主要部分后,只剩下確定參數啦

n作為上界是必須一直使用的,index作為下界需要在傳遞過程中改變,答案數組current也需要傳遞使用

那么整個函數的定義為void dfs(int index,int n,vector<int> current){

在主函數中完善輸入,調用函數即可實現該題

code

#include<bits/stdc++.h>
using namespace std;
void dfs(int index,int n,vector<int> current){if(index>n){for(int i=0;i<current.size();i++){cout<<current[i]<<" ";}cout<<endl;return;}dfs(index+1,n,current);//不選擇該數字 current.push_back(index);//index加入該數字 dfs(index+1,n,current);//生成新的組合 
}int main(){int n;cin>>n;vector<int> current;dfs(1,n,current);return 0;
}

題目四:遞歸實現排列型枚舉

問題描述

1-n個這 n 個整數拍成一排并打亂次序,輸出所有可以選擇的方案。

示例

????????輸入:3

????????輸出:

????????123

? ? ? ? 132

????????213

????????231

????????312

????????321

解題步驟

這個題目如果直接用筆算的話,可以看成是三個格子的填空游戲

從1開始作為第一位,再從余下的數字選擇填入,是全排列

利用遞歸解決還是需要3步走

確定終止條件

如果第一位大于n那么結束,并輸出該序列

    if(i>n){for(int j=1;j<=n;j++){cout<<s[j]<<" ";}cout<<endl;return;}

按順序給1,2,3,4,,,n這n個數字一個當老大的機會,并逐步確定后面的小弟隊伍

注意記錄每一位小弟的排隊情況(即有無使用過)

排進去后進行下一位,

遞歸完畢后會開啟新一輪,需要恢復當前值和當前結果數組的使用情況(下一輪重新開始還得用呢!)

    for(int j=1;j<=n;j++){if(!used[j]){//該數字沒有被使用過 s[i]=j;//記錄該數字 used[j]=true;//更新記錄情況dfs(i+1);//進行下一輪 used[j]=false;//回溯 s[i]=0;//清空 }}

?那么這個dfs的參數就比較簡單了,只需要傳入n即可void dfs(int i)

code

#include<iostream>
using namespace std;const int N=10;
int n;
bool used[N];//記錄數字是否用過 
int s[N];//保存方案 
void dfs(int i){if(i>n){for(int j=1;j<=n;j++){cout<<s[j]<<" ";}cout<<endl;return;}for(int j=1;j<=n;j++){if(!used[j]){//該數字沒有被使用過 s[i]=j;//記錄該數字 used[j]=true;//更新記錄情況dfs(i+1);//進行下一輪 used[j]=false;//回溯 s[i]=0;//清空 }}
}
int main(){cin>>n;dfs(1);return 0;
}

題目五:遞歸實現組合型枚舉

問題描述

1-n個數字中隨機選取?m?個,每種方案按照里的數字按照從小到大的順序排列,按照字典序輸出。

示例

????????輸入:5 3

????????輸出:

????????123

????????124

????????125

????????134......

????????345

解題步驟

這題不一樣之處在于它多了個m,由兩個值決定取值范圍,取值個數

思路還是一樣的

先寫出終止條件,如果當前數大于最大取值個數m,輸出當前序列

	if(now>m){for(int i=1;i<=m;i++){cout<<s[i]<<" ";}cout<<endl;return;} 

?單層遞歸呢就是,從當前遍歷到的數字一直到n中,遍歷選擇,存入s中,再取下一位

	for(int i=start;i<=n;i++){//可用范圍內隨意挑選 s[now]=i;dfs(now+1,i+1);s[now]=0;}

?那么函數的參數需要當前值和開始值void dfs(int now,int start)

除此以外該函數可以再加一個剪枝操作,不做無用功

if(now+n-start<m)?? ?return;//不夠用

同樣在主函數中進行輸入和傳參調用即可

code

#include<iostream>
using namespace std;
const int N=35;
int n,m;
int s[N];
void dfs(int now,int start){if(now+n-start<m)	return;//不夠用if(now>m){for(int i=1;i<=m;i++){cout<<s[i]<<" ";}cout<<endl;return;} for(int i=start;i<=n;i++){//可用范圍內隨意挑選 s[now]=i;dfs(now+1,i+1);s[now]=0;}
}
int main(){cin>>n>>m;dfs(1,1);return 0;
}

練習題!

我在速成藍橋杯大神,你也來練一道吧!點擊下方連接加入,為我砍一題!

?P8707 [藍橋杯 2020 省 AB1] 走方格 - 洛谷

【藍橋杯真題】 | 走方格(2020省賽)-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/bicheng/73577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73577.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

當大模型訓練遇上“雙向飆車”:DeepSeek開源周 DualPipe解析指南

前言 在大模型訓練中&#xff0c;傳統流水線并行因單向數據流和通信延遲的限制&#xff0c;導致GPU利用率不足60%&#xff0c;成為算力瓶頸。DeepSeek團隊提出的DualPipe雙向流水線架構&#xff0c;通過雙向計算流與計算-通信重疊的創新設計&#xff0c;將前向與反向傳播拆解為…

藍橋杯好題推薦---前綴和

&#x1f308;個人主頁&#xff1a; 羽晨同學-CSDN博客 &#x1f4ab;個人格言:“成為自己未來的主人~” 題目鏈接 【模板】前綴和https://ac.nowcoder.com/acm/problem/226282 解題思路 這種題目是要求我們找到一個數組中從l到r的元素的和&#xff0c;查詢Q次&#xff0c;…

Nginx快速上手

什么是nginx Nginx 是一款開源的高性能 HTTP 和反向代理服務器&#xff0c;同時也提供了 IMAP/POP3/SMTP 代理功能。它由俄羅斯程序員 Igor Sysoev 于2004年首次發布&#xff0c;最初設計目的是為了解決 C10k 問題&#xff0c;即如何讓單臺服務器同時處理1萬個并發連接的問題。…

【C++】:STL詳解 —— 布隆過濾器

目錄 布隆過濾器的概念 布隆過濾器的優點 布隆過濾器的缺點 布隆過濾器使用場景 布隆過濾器的實現 布隆過濾器的概念 布隆過濾器&#xff08;Bloom Filter&#xff09; 是一種空間效率極高的概率型數據結構&#xff0c;用于快速判斷一個元素是否屬于某個集合。其核心特點…

從Instagram到畫廊:社交平臺如何改變藝術家的展示方式

從Instagram到畫廊&#xff1a;社交平臺如何改變藝術家的展示方式 在數字時代&#xff0c;藝術家的展示方式正在經歷一場革命。社交平臺&#xff0c;尤其是Instagram&#xff0c;已經成為藝術家展示作品、與觀眾互動和建立品牌的重要渠道。本文將探討社交平臺如何改變藝術家的…

MySQL(事物上)

目錄 示例&#xff1a; 一 引入事物 1. 概念 2. 事物的4大特性 3. 為什么要有事物&#xff1f; 二 事物操作 1. 查看存儲引擎支持的事物 2. 事物的提交方式 2.1 查看事物的默認提交方式 2.2 設置事物的默認提交方式 2.3 查看事物的全局隔離級別 2.4 驗證事物的回滾…

Spring Boot 實現多數據源配置

一、配置流程 在 Spring Boot 中實現多數據源配置通常用于需要連接多個數據庫的場景。主要有以下幾個步驟&#xff1a; 配置多個數據源的連接信息。定義多個數據源的 Bean。為每個數據源配置MyBatis的SqlSessionFactory和事務管理器。為每個數據源定義Mapper接口和Mapper XML…

p5.js:繪制各種內置的幾何體,能旋轉

向 豆包 提問&#xff1a;請編寫 p5.js 示例&#xff0c; 繪制各種內置的幾何體&#xff0c;能讓這些幾何體緩慢旋轉。 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . 此代碼創建了一個包含多個內置幾何體的 3D 場景&#xff0c;每個幾何體都有不同的顏色和位置。運行代…

結構體定義與應用

引言 到今天為止,c語言的基礎操作和基礎數據類型,就都已經結束了,大家都知道,如果要實現復雜的功能,大家都可以通過函數封裝調用,那么如果要實現基礎數據類型的封裝,該怎么辦呢?答案就是結構體。 在C語言編程中,結構體(struct)是非常重要的一個概念,它為程序員提供…

MindGYM:一個用于增強視覺-語言模型推理能力的合成數據集框架,通過生成自挑戰問題來提升模型的多跳推理能力。

2025-03-13&#xff0c;由中山大學和阿里巴巴集團的研究團隊提出了MindGYM框架&#xff0c;通過合成自挑戰問題來增強視覺-語言模型&#xff08;VLMs&#xff09;的推理能力。MindGYM框架通過生成多跳推理問題和結構化課程訓練&#xff0c;顯著提升了模型在推理深度和廣度上的表…

R語言零基礎系列教程-01-R語言初識與學習路線

代碼、講義、軟件回復【R語言01】獲取。 R語言初識 R是一個開放的統計編程環境&#xff0c;是一門用于統計計算和作圖的語言。“一切皆是對象”&#xff0c;數據、函數、運算符、環境等等都是對象。易學&#xff0c;代碼像偽代碼一樣簡潔&#xff0c;可讀性高強大的統計和可視…

PythonWeb開發框架—Flask-APScheduler超詳細使用講解

1.定時任務的兩種實現方式 1.1 用scheduler.task裝飾任務 安裝插件&#xff1a; pip install Flask-APScheduler pip install apscheduler 腳本實現&#xff1a; ###app.py##導入依賴庫 from flask import Flask import datetime import config from flask_apscheduler i…

python_巨潮年報pdf下載

目錄 前置&#xff1a; 步驟&#xff1a; step one: pip安裝必要包&#xff0c;獲取年報url列表 step two: 將查看url列表轉換為pdf url step three: 多進程下載pdf 前置&#xff1a; 1 了解一些股票的基本面需要看歷年年報&#xff0c;在巨潮一個個下載比較費時間&…

從0到1構建AI深度學習視頻分析系統--基于YOLO 目標檢測的動作序列檢查系統:(2)消息隊列與消息中間件

文章大綱 原始視頻隊列Python 內存視頻緩存優化方案(4GB 以內)一、核心參數設計二、內存管理實現三、性能優化策略四、內存占用驗證五、高級優化技巧六、部署建議檢測結果隊列YOLO檢測結果隊列技術方案一、技術選型矩陣二、核心實現代碼三、性能優化策略四、可視化方案對比五…

React Native 如何使用 Expo 快速開發?

React Native是當下熱門的跨平臺移動開發框架&#xff0c;而Expo則是它的重要開發工具之一。Expo提供了一套完整的開發環境&#xff0c;使開發者無需安裝Android Studio或Xcode也能快速運行React Native項目。它包含了眾多內置API&#xff0c;如相機、地理位置、推送通知等&…

中考英語之09從句

1 賓語從句 定義 在主從復合句中充當賓語&#xff0c;位于及物動詞、介詞或復合謂語之后的從句。 引導詞 綜述&#xff1a; that&#xff08;可省略&#xff09;、if/whether、連接代詞&#xff08;what、which、who、whom、whose 等&#xff09;和連接副詞&#xff08;when、…

平方矩陣問題

Ⅰ 回字形二維數組 #include <iostream> #include <iomanip> using namespace std; int main(){int n;while(cin>>n,n){for(int i0; i<n;i){for(int j0; j<n; j){int upi, downn-i1, leftj, rightn-j1;cout<<min(min(up,down),min(left,right)…

C++模版(復習)

1.泛型編程&#xff1a;編寫與類型無關的通用代碼&#xff0c;是代碼復用的一種手段。模板是泛型編程的基礎 2.函數模板的格式 template<typename T1,typename T2,…,typename Tn> 返回類型 函數名(參數列表) { ??//函數體 } 3.template<class T1,class T2,…,class…

【sklearn 05】sklearn功能模塊

sklearn功能模塊 分類&#xff1a;識別某個對象屬于那個類別回歸&#xff1a;預測與對象相關聯的連續值屬性聚類&#xff1a;將相似對象自動分組降維&#xff1a;減少要考慮的隨機變量的數量模型選擇&#xff1a;比較、驗證、選擇參數和模型預處理&#xff1a;特征提取和歸一化…

使用Qt創建懸浮窗口

在Qt中創建懸浮窗口&#xff08;如無邊框、可拖動的浮動面板或提示框&#xff09;可以通過以下方法實現。以下是幾種常見場景的解決方案&#xff1a; 方法1&#xff1a;使用無邊框窗口 鼠標事件拖動 適用于自定義浮動工具窗口&#xff08;如Photoshop的工具欄&#xff09;。 …