遞歸算法題練習(數的計算、帶備忘錄的遞歸、計算函數值)

遞歸的介紹

概念:遞歸是指函數直接或間接調用自身的過程。
解釋遞歸的兩個關鍵要素:
基本情況(遞歸終止條件):遞歸函數中的一個條件,當滿足該條件時,遞歸終止,避免無限遞歸。可以理解為直接解決極小規模問題的方法。遞歸表達式(遞歸調用):遞歸函數中的語句,用于解決規模更小的子問題再將子問題的答案合并成為當前問題的答案。

遞歸如何實現

遞歸函數的基本結構如下:
返回類型 函數名(參數列表){基本情況(遞歸終止條件)
if(滿足終止條件){返回終止條件下的結果遞歸表達式(遞歸調用)
}
else if{將問題分解為規模更小的子問題使用遞歸調用解決子問題返回子問題的結果
}

實現過程:

  • 將大問題分解為規模更小的子問題。
  • 使用遞歸調用解決每個子問題。
  • 通過遞歸終止條件來結束遞歸。

設計時需注意的細節:

  1. 確保遞歸一定能到遞歸出口,避免無限遞歸,這可能導致TLE(超時)、MLE(超內存)、或RE(運行錯誤)
  2. 考慮邊界條件,有時候遞歸出口不止一個。
  3. 避免不必要的重復計算,盡可能優化遞歸函數的性能(例如使用記憶化)。

遞歸和循環的比較

遞歸的特點:

  1. 直觀、簡潔,易于理解和實現
  2. 適用于問題的規模可以通過遞歸調用不斷減小的情況。
  3. 可以處理復雜的數據結構和算法,如樹和圖的遍歷。(線段樹)
  4. 存在棧溢出風險(棧空間一般只有8MB,所以遞歸層數不宜過深一般不超過1e6層)。

循環的特點:

  • 1.直接控制流程,效率較高。(常數小)
  • 2.適用于問題的規模沒有明顯的縮減,或者需要特定的迭代次數。(二元組)
  • 3.適合處理大部分的動態規劃問題

在部分情況下,遞歸和循環可以相互轉化。(DFS)

例題:

(一、斐波那契數列,帶備忘錄的遞歸)

已知F(1)=F(2)= 1;n>3時F(n)=F(n-1)+F(n-2)
輸入n,求F(n),n<=100000,結果對1e9+7取模

如果直接使用遞歸,難以算出結果,需要優化

時間復雜度為O(2^n)

#include <bits/stdc++.h>  
using namespace std;
using ll = long long; // 使用別名ll代表long long  const int N = 1e5 + 9;
const ll p = 1e9 + 7; // 定義模數p  ll fib(int n) {if (n <= 2) return 1; // 基準情況  return (fib(n - 1) + fib(n - 2)) % p; // 計算并存儲結果  
}int main() {int n;cin >> n;for (int i = 1; i <= n; ++i) {cout << fib(i) << '\n'; // 輸出每個i的fibonacci數并換行  }return 0;
}

?優化方法:帶備忘錄的遞歸

時間復雜度為O(n)

#include <bits/stdc++.h>  
using namespace std;
using ll = long long; // 使用別名ll代表long long  const int N = 1e5 + 9;
const ll p = 1e9 + 7; // 定義模數p  ll dp[N]; // 定義dp數組作為備忘錄  // 帶備忘錄的遞歸
ll fib(int n) {if (dp[n]) return dp[n]; // 如果已經計算過,直接返回結果,不需要重復計算if (n <= 2) return 1; // 基準情況  return dp[n] = (fib(n - 1) + fib(n - 2)) % p; // 計算并存儲結果  
}int main() {int n;cin >> n;for (int i = 1; i <= n; ++i) {cout << fib(i) << '\n'; // 輸出每個i的fibonacci數并換行  }return 0;
}

(二、數的計算)

藍橋 OJ 760

用戶登錄

題目描述
輸入一個自然數 n(n < 1000),我們對此自然數按照如下方法進行處理:
1.不作任何處理;
2.在它的左邊加上一個自然數,但該自然數不能超過原數的一半;

3.加上數后,繼續按此規則進行處理,直到不能再加自然數為止。問總共可以產生多少個數。
輸入描述
輸入一個正整數 n。
輸出描述
輸出一個整數,表示答案。
輸入輸出樣例

思路:

我們可以將題意轉化一下,轉化成在右邊加上自然數,因為“在左邊加上0”是沒有意義的,不會改變這個數字大小,所以我們在右邊也不能加上0。
用一個數組a記錄下數字每一位上的數字是多少,然后枚舉當前位上的數字,遞歸的向下去求方案數并求和即可。

#include<bits/stdc++.h>
using namespace std;const int N = 20;
int a[N];int dfs(int dep)// dep表示當前的深度
{int res = 1;// 枚舉當前這層可以放下哪些數字for (int i = 1; i <= a[dep - 1] / 2; ++i){a[dep] = i;res += dfs(dep + 1);}return res;
}int main()
{int n; cin >> n;a[1] = n;cout << dfs(2) << '\n';return 0;
}

(三、計算函數值)

用戶登錄

問題描述:

在一個神秘的世界中,有一個傳說中的神秘花園,被認為蘊藏著無限的知識。但要進入這個花園,訪客必須解決一道神秘數學難題,這個難題與一個特殊的數學函數——“神秘函數”S(c)——緊密相關。

神秘函數S(c)的定義:

  • 當c為0時,S(0) = 1。
  • 當c為偶數時,S(c) = S(c/2)。
  • 當c為奇數時,S(c) = S(c-1) + 1。

任務:

編寫一個程序,根據輸入的正整數α,計算神秘函數S(α)的值。正確解答這道難題將獲得通行證,得以進入神秘花園探索知識寶藏。

輸入格式:

輸入包含一個正整數α(1 ≤ α ≤ 10^6),表示要求解的神秘函數問題中的參數。

輸出格式:

輸出一個整數,表示神秘函數S(α)的值,即成功解決問題后得到的答案。

解題思路

這道題主要思想就是遞歸調用,實現了對遞推方程的求解問題。

首先,我們定義一個函數,它所實現的功能是返回通過神秘函數運算得到的值。

那么,我們可以分為三個部分:

  1. 當 x=0?時,我們知道通過神秘函數運算得到的值為?1,因此直接返回?1。
  2. 當?x?為偶數時,由于 S(x)=S(x/2),故我們只需要計算 S(x/2)?的值并返回即可,這時我們再次調用我們定義的函數并以 x/2?為初始值。
  3. 當?x?為奇數時,由于 S(x)=S(x?1)+1,故我們只需要計算S(x?1)?的值并返回 S(x?1)+1?即可,這時我們再次調用我們定義的函數并以 x?1?為初始值。

經過如上過程便可以得出最終結果。

#include <bits/stdc++.h>// 奇數減一會變成偶數,偶數除以2
// 等價與我們最多使用兩次代價使 x 除以 2
// 除以 2 最多 log 次
// O(log)void solve(const int &Case) { int x;std::cin >> x;std::function<int(int)> S = [&](int x) {if (x == 0)return 1;if (x % 2 == 0) {return S(x / 2);}return S(x - 1) + 1;};std::cout << S(x) << '\n';
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int T = 1;for (int i = 1; i <= T; i++)solve(i);return 0;
}

?今天就先到這了!!!

看到這里了還不給博主扣個:
?? 點贊??收藏 ?? 關注!

你們的點贊就是博主更新最大的動力!
有問題可以評論或者私信呢秒回哦。

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

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

相關文章

k8s 中 namspace deployment pod services 之間的關系

在Kubernetes&#xff08;K8s&#xff09;中&#xff0c;Namespace&#xff08;命名空間&#xff09;是一種用于將集群內部資源劃分為不同邏輯組的機制。Deployment、Pod和Service是Kubernetes中常見的資源&#xff0c;它們之間的關系如下&#xff1a; Namespace&#xff08;命…

網絡安全攻防演練:企業藍隊建設指南

第一章 概述 背景 網絡實戰攻防演習是當前國家、重要機關、企業組織用來檢驗網絡安全防御能力的重要手段之一,是對當下關鍵信息系統基礎設施網絡安全保護工作的重要組成部分。網絡攻防實戰演習通常是以實際運行的信息系統為攻擊目標,通過在一定規則限定下的實戰攻防對抗,最…

認識通訊協議——TCP/IP、UDP協議的區別,HTTP通訊協議的理解

目錄 引出認識通訊協議1、TCP/IP協議&#xff0c;UDP協議的區別2、HTTP通訊協議的講解 Redis沖沖沖——緩存三兄弟&#xff1a;緩存擊穿、穿透、雪崩緩存擊穿緩存穿透緩存雪崩 總結 引出 認識通訊協議——TCP/IP、UDP協議的區別&#xff0c;HTTP通訊協議的理解 認識通訊協議 …

第九屆數學與人工智能國際會議 (ICMAI 2024)即將召開!

2024年第九屆數學與人工智能國際會議將于2024年5月10-12日在中國北京召開。本屆會議由北京工業大學主辦&#xff0c;旨在促進應用邏輯、算法與復雜性研究&#xff0c;使用數學的方法促進人工智能理論與應用發展&#xff0c;加深學術交流與合作。我們熱忱歡迎從事相關技術研究的…

開源WIFI繼電器之使用說明

1、設備說明 1.1外觀 1.2供電 100~240V交流輸入&#xff0c;Lin接火線&#xff0c;Nin接零線。 1.3連接負載 輸出信號為繼電器無源信號&#xff0c;用于信號的導通和斷開控制&#xff0c;最大可通過10A負載電流&#xff0c;COM為繼電器公共端&#xff0c;NO為繼電器常開端&a…

藍牙耳機推薦高性價比,五大超好用藍牙耳機推薦,趕緊上車!

?隨著技術的不斷進步&#xff0c;藍牙耳機的性能和配置也在不斷提升&#xff0c;各大品牌都在推出具有各種特色的產品。其中&#xff0c;音質是很多消費者最為關注的一點。因此&#xff0c;我在這里為大家推薦幾款音質表現還不錯的幾款藍牙耳機&#xff0c;供大家參考。 一、挑…

SpringAOP

1. SpringAOP的基本概念 SpringAOP&#xff08;Aspect-Oriented Programming&#xff09;即面向切面編程&#xff0c;是Spring框架體系中非常重要的功能模塊之一。AOP與OOP&#xff08;面向對象編程&#xff09;相輔相成&#xff0c;提供了一種與OOP不同的抽象軟件結構的視圖。…

Java畢業設計 基于SSM SpringBoot vue購物比價網站

Java畢業設計 基于SSM SpringBoot vue購物比價網站 SSM vue 購物比價網站 功能介紹 首頁 圖片輪播 商品 商品分類 商品詳情 評論 收藏 商品攻略 商品信息 公告欄 在線反饋 登錄 注冊 個人中心 我的收藏 后臺管理 登錄 注冊商品戶 個人中心 修改密碼 個人信息 商品戶管理 用戶…

IDC 中搭建 Serverless 應用平臺:通過 ACK One 和 Knative 玩轉云資源

作者&#xff1a;元毅、莊宇 如何打造云上&#xff08;公共云&#xff09;、云下&#xff08;IDC 數據中心&#xff09;統一的云原生 Serverless 應用平臺&#xff0c;首先我們來看一下 ChatGPT 4 會給出什么樣的答案&#xff1a; 如何打造云上、云下統一的云原生 Serverless…

【CesiumJS-3】加載傾斜模型數據(3DTilest)以及修改位置

引入傾斜模型數據 // 加載3DTiles數據let tileset;try {tileset await Cesium.Cesium3DTileset.fromUrl("/api/3DTiles/b3dm_qx/tileset.json");viewer.value.scene.primitives.add(tileset); // 傾斜模型添加到場景中viewer.value.zoomTo(tileset); // 視角定位到傾…

【音視頻處理】使用ffmpeg實現多個視頻合成一個視頻(按宮格視圖)

先上結果 環境 硬件&#xff1a;通用PC 系統&#xff1a;Windows 測試有效 軟件&#xff1a;ffmpeg 解決 0、命令 ffmpeg.exe -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex "[0:v]scaleiw/2:ih/2,pad2*iw:2*ih[a]; [1:v]scaleiw/2:ih/2…

GO學習記錄

這里寫目錄標題 00 環境二級目錄三級目錄 00 環境 參考的&#xff1a;https://www.liwenzhou.com/posts/Go/install/ 編譯運行&#xff1a; go mod init <項目名> // 在目錄下創建項目 go mod init hello // 編譯二級目錄 三級目錄

BioTech - 大分子藥物設計 概述

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/136302202 大分子藥物設計領域主要包括3個方面&#xff0c;即大環類藥物設計、蛋白質與多肽類藥物設計、核酸藥物設計等&#xff0c;具體如下&…

selenium控制控件出現StaleElementReferenceException

attempts0while attempts<2:try:ywbh_text self.getElement(self.driver, //*[id"board_data"]/tbody/tr[1]/td[2])ywbh_text.click()config.zscjhbgbz_ywbh ywbh_text.textprint("保存業務編號&#xff1a;"ywbh_text.text"到conf中 zscjhbgbz_…

DolphinScheduler——奇富科技的調度實踐

目錄 一、技術架構 二、業務挑戰 2.1 調度任務量大 2.2 運維復雜 2.3 SLA要求高 三、調度優化實踐 3.1 重復調度 3.2 漏調度 3.3 Worker服務卡死 3.4 任務重復運行 四、服務監控 4.1 方法耗時監控 4.2 任務調度鏈路監控 五、用戶收益 原文大佬的這篇調度系統案例…

nginx使用詳解--緩存

Nginx 是一個功能強大的 Web 服務器和反向代理服務器&#xff0c;它可以用于實現靜態內容的緩存&#xff0c;緩存可以分為客戶端緩存和服務端緩存。 客戶端緩存 客戶端緩存指的是瀏覽器緩存, 瀏覽器緩存是最快的緩存, 因為它直接從本地獲取(但有可能需要發送一個協商緩存的請…

【XR806開發板試用】全網首發,對接騰訊云平臺的血淚史

1.前面的話 在上次連夜肝出了華為云平臺的帖子:https://aijishu.com/a/1060000000287434 之后,論壇里的反響平平,好評沒有,點贊更無,抱著已完成任務成功白嫖一塊板子的心態,把板子收在了盒子里,第二天,助手小姐姐跟我說為何不把騰訊云的做了,對于這個要求我其實是拒絕的,但是小…

鴻蒙開發之組件間方法傳遞(方法回調)

目前使用的方式有兩種&#xff0c;一種是父子組件方法傳遞&#xff0c;一種是系統提供的emitter。 一、父子組件方法傳遞 1.1 使用場景 當我們父組件中有一個方法&#xff0c;需要子組件在修改完數據后回調父組件的方法時候。有點抽象&#xff1a;這樣解釋一下&#xff0c;父…

深度學習-Pytorch運算的基本數據類型

深度學習-Pytorch模型運算的基本數據類型 用pytorch構建模型&#xff0c;并訓練模型&#xff0c;得到一個優化的模型&#xff0c;那么模型構造的數據類型怎樣的&#xff1f; 數據分析 數據分析-Pandas如何轉換產生新列 數據分析-Pandas如何統計數據概況 數據分析-Pandas如…

Three.js-04軌道控制器

1.導入 說明&#xff1a;相機圍繞目標進行軌道運動。也就是可以通過鼠標拖拽進行移動視角。 import { OrbitControls } from three/addons/controls/OrbitControls.js; 2.使用 說明&#xff1a;構造controls對象&#xff0c;再調用update方法&#xff1b;為了使效果更為明顯…