藍橋杯之遞歸二

1.數的劃分

題目描述

將整數?nn?分成?kk?份,且每份不能為空,任意兩份不能相同(不考慮順序)。

例如:n=7,k=3n=7,k=3,下面三種分法被認為是相同的。

1,1,5;1,5,1;5,1,1;1,1,5;1,5,1;5,1,1;

問有多少種不同的分法。

輸入描述

輸入一行,22?個整數?n,k?(6≤n≤200,2≤k≤6)n,k?(6≤n≤200,2≤k≤6)。

輸出描述

輸出一個整數,即不同的分法。

輸入輸出樣例

示例 1

輸入

7 3

輸出

4

遞歸解題思路

看到“整數分拆”問題,直接想到“遞歸”

遞歸的核心思想:將大問題分解為小問題,通過解決小問題來構建大問題的解。

遞歸的終止條件:

  1. nm 為 0,或者 n 小于 m 時,分拆方式數量為 0。

  2. m 為 1 或 n 等于 m 時,分拆方式數量為 1。

遞歸的分解邏輯:

  1. 不選1的情況:將每個數字減去1,問題轉化為 f(n - m, m)

  2. 選1的情況:其中一個數字是1,問題轉化為 f(n - 1, m - 1)

最終結果是兩種情況的和:f(n - m, m) + f(n - 1, m - 1)

解題步驟模板:

public static int f(int n, int m) {// 邊界條件if (n == 0 || m == 0 || n < m) {return 0;}if (m == 1 || n == m) {return 1;}// 遞歸邏輯else {return f(n - m, m) + f(n - 1, m - 1);}
}

示例代碼模板:

import java.util.Scanner;public class Main {// 遞歸函數,用于計算將整數 n 分成 m 份的方式數public static int f(int n, int m) {// 邊界條件:當 n 或 m 為 0,或者 n 小于 m 時,分拆方式數量為 0if (n == 0 || m == 0 || n < m) {return 0;}// 當 m 為 1 或 n 等于 m 時,分拆方式數量為 1if (m == 1 || n == m) {return 1;}// 遞歸邏輯:// 1. 不選1的情況:將每個數字減去1,問題轉化為 f(n - m, m)// 2. 選1的情況:其中一個數字是1,問題轉化為 f(n - 1, m - 1)// 總分拆方式數量為兩者的和else {return f(n - m, m) + f(n - 1, m - 1);}}// 主函數,程序入口public static void main(String[] args) {// 創建 Scanner 對象,用于讀取用戶輸入Scanner sc = new Scanner(System.in);// 讀取用戶輸入的整數 nint n = sc.nextInt();// 讀取用戶輸入的整數 kint k = sc.nextInt();// 調用遞歸函數 f(n, k),計算分拆方式數量// 輸出結果System.out.println(f(n, k));}
}

思維導圖:

訓練方法:

  1. 理解遞歸思想:仔細閱讀代碼,確保理解遞歸的終止條件和遞歸邏輯。

  2. 手算小例子:選擇一個小的例子(如 n = 4m = 2),手動計算遞歸調用的過程,然后用代碼驗證結果。

  3. 調試和優化:觀察遞歸調用的深度和次數,嘗試用記憶化技術優化代碼,避免重復計算。

  4. 擴展應用:將代碼邏輯應用到其他類似問題,如“將整數分成任意多份”的問題

2.數的計算

題目描述

輸入一個自然數?n?(n≤1000)n?(n≤1000),我們對此自然數按照如下方法進行處理:

  1. 不作任何處理;

  2. 在它的左邊加上一個自然數,但該自然數不能超過原數的一半;

  3. 加上數后,繼續按此規則進行處理,直到不能再加自然數為止。

問總共可以產生多少個數。

輸入描述

輸入一個正整數?nn。

輸出描述

輸出一個整數,表示答案。

輸入輸出樣例

示例 1

輸入

6

輸出

6

遞歸解題思路

看到“整數分拆”問題,直接想到“遞歸”

遞歸的核心思想:將大問題分解為小問題,通過解決小問題來構建大問題的解。

遞歸的終止條件:當 n == 1 時,分拆方式數量為 1。

遞歸的分解邏輯:通過遍歷從1到n/2的數i,每次將當前數i分拆,并遞歸計算i的分拆方式。

解題步驟模板:

public static void f(int n) {// 遞歸終止條件if (n == 1) {return;}// 遍歷 i 從 1 到 n/2,計算分拆方式for (int i = 1; i <= n / 2; i++) {// 每次分拆時,增加結果計數res++;// 遞歸計算更小的整數 i 的分拆方式f(i);}
}

示例代碼模板:

import java.util.Scanner;public class Main {// 全局變量,用于存儲最終結果static int res = 1;// 遞歸函數,用于計算整數 n 的分拆方式數量public static void f(int n) {// 遞歸終止條件:當 n == 1 時,分拆方式數量為 1if (n == 1) {return;}// 遍歷 i 從 1 到 n/2,計算分拆方式for (int i = 1; i <= n / 2; i++) {// 每次分拆時,增加結果計數res++;// 遞歸計算更小的整數 i 的分拆方式f(i);}}// 主函數,程序入口public static void main(String[] args) {// 創建 Scanner 對象,用于讀取用戶輸入Scanner sc = new Scanner(System.in);// 讀取用戶輸入的整數 nint n = sc.nextInt();// 調用遞歸函數 f(n),計算分拆方式數量f(n);// 輸出最終結果System.out.println(res);}
}

思維導圖:

訓練方法:

  1. 理解遞歸思想:仔細閱讀代碼,確保理解遞歸的終止條件和遞歸邏輯。

  2. 手算小例子:選擇一個小的例子(如 n = 4),手動計算遞歸調用的過程,然后用代碼驗證結果。

  3. 調試和優化:觀察遞歸調用的深度和次數,嘗試用記憶化技術優化代碼,避免重復計算。

  4. 擴展應用:將代碼邏輯應用到其他類似問題,如“將整數分成特定數量的份”或“將整數分成不相等的份”的問題。

?

?自學藍橋杯筆記,希望我們可以一起學習!

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

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

相關文章

LeetCode(Hot.2)—— 49.字符異位詞分組題解

Problem: 49. 字母異位詞分組 字母異位詞的定義是&#xff1a;兩個單詞的字母組成一樣&#xff0c;但順序可以不同&#xff0c;比如 eat、tea 和 ate 就是一個組的。 思路 將每個字符串按字母排序&#xff0c;把排序后的字符串作為 key&#xff0c;相同 key 的放在一個 list 中…

為什么信號完整性對于高速連接器設計至關重要?

外部連接器通過在各種電子元件和系統之間可靠地傳輸數據而不損失保真度來保持信號完整性。在本文中&#xff0c;我們將討論信號完整性的重要性&#xff0c;回顧高速部署挑戰&#xff0c;并重點介紹各種連接器設計策略&#xff0c;以防止失真和降級。 了解連接器信號完整性挑戰…

得物官網sign簽名逆向分析

打開得物官網&#xff0c;點擊鞋類&#xff0c;可以看到請求 直接搜sign function p(e) {return f()("".concat(e ? s()(e).sort().reduce(function(t, n) {return "".concat(t).concat(n).concat(e[n])}, "") : "", "048a9…

Ubuntu 安裝WPS Office

文章目錄 Ubuntu 安裝WPS Office下載安裝文件安裝WPS問題1.下載缺失字體文件2.安裝缺失字體 Ubuntu 安裝WPS Office 下載安裝文件 需要到 WPS官網 下載最新軟件&#xff0c;比如wps-office_12.1.0.17900_amd64.deb 安裝WPS 執行命令進行安裝 sudo dpkg -i wps-office_12.1…

javaSE.判空包裝類

判空包裝類Optional&#xff0c;這個類可以很有效的處理空指針問題 空指針異常&#x1f447; 特判null&#x1f447; Optional類可以更加優雅地處理這種問題&#x1f447;&#x1f447; ofNullable&#x1f447; isPresent isEmpty &#x1f447; &#x1f447; 包裝之后&…

使用 vcpkg 構建支持 HTTPS 的 libcurl 并解決常見鏈接錯誤

適用環境&#xff1a;Windows 10/11 Visual Studio 2022 CMake ≥ 3.20 目標讀者&#xff1a;希望在 C 項目中輕松調用 HTTPS&#xff08;GET/POST/PUT/DELETE&#xff09;&#xff0c;又被 LNK20xx 鏈接錯誤困擾的開發者 目錄 為什么選 vcpkg 與 libcurl用 vcpkg 安裝帶 SS…

ISO26262-淺談用例導出方法和測試方法

目錄 1 摘要2 測試方法3 測試用例導出方法4 測試方法與用例導出方法的差異和聯系5 結論 1 摘要 ISO26262定義了測試方法和用例導出方法&#xff0c;共同保證產品的開發質量。但在剛開始學習ISO26262的時候&#xff0c;又不是非常清晰地理解它倆的區別和聯系。本文主要對它倆的…

RoBoflow數據集的介紹

https://public.roboflow.com/object-detection&#xff08;該數據集的網址&#xff09; 可以看到一些基本情況 如果我們想要下載&#xff0c;直接點擊 點擊圖像可以看到一些基本情況 可以點擊紅色箭頭所指&#xff0c;右邊是可供選擇的一些yolo模型的格式 如果你想下載…

基于CFSSL構建高可用ETCD集群全指南(含TLS證書管理)

基于CFSSL構建高可用ETCD集群全指南&#xff08;含TLS證書管理&#xff09; 摘要&#xff1a;本文深入講解使用CFSSL工具簽發TLS證書&#xff0c;并部署生產級高可用ETCD集群的完整流程。涵蓋證書全生命周期管理、集群配置優化及安全加固方案&#xff0c;適用于Kubernetes、分…

【設計模式】適配器模式:讓不兼容的接口和諧共處

引言 在軟件開發中&#xff0c;我們經常會遇到這樣的情況&#xff1a;兩個已經存在的接口無法直接協同工作&#xff0c;但我們又希望它們能夠無縫對接。這時&#xff0c;適配器模式就派上用場了。適配器模式&#xff08;Adapter Pattern&#xff09;是一種結構型設計模式&…

doris/clickhouse常用sql

一、doris常用SQL 1、doris統計數據庫的總大小&#xff08;單位&#xff1a;MB&#xff09; SELECT table_schema AS database_name,ROUND(SUM(data_length) / 1024 / 1024, 2) AS database_size_MB FROM information_schema.tables WHERE table_schema NOT IN (information…

軟件架構分層策略對比及Go項目實踐

一、水平分層 vs 功能劃分 vs 組件劃分 維度水平分層功能劃分組件劃分核心思想按垂直層次劃分職責&#xff08;如表示層、業務層、數據層&#xff09;按業務功能模塊劃分&#xff08;如用戶管理、訂單服務、支付模塊&#xff09;按技術或業務能力劃分獨立組件&#xff08;如數…

Linux進程地址空間、寫時拷貝

1.進程地址空間 感知進程地址空間 C/C有內存的概念&#xff0c;內存空間包括棧、堆、代碼段等等&#xff0c;下面是32位下的內存分布圖&#xff0c;自底向上(由0x00000000至0xFFFFFFFF); 下面通過程序來驗證各個數據在該空間的地址&#xff0c;由此感知整個地址空間的分布情…

python成功解決AttributeError: can‘t set attribute ‘lines‘

文章目錄 報錯信息與原因分析解決方法示例代碼代碼解釋總結 報錯信息與原因分析 在使用 matplotlib繪圖時&#xff0c;若嘗試使用 ax.lines []來清除圖表中的線條&#xff0c;會遇到AttributeError: can’t set attribute錯誤。這是因為 ax.lines是一個只讀屬性&#xff0c;不…

從零搭建微服務項目Pro(第6-2章——微服務鑒權模塊SpringSecurity+JWT)

前言&#xff1a; 在上一章已經實現了SpringBoot單服務的鑒權&#xff0c;在導入SpringSecurity的相關依賴,以及使用JWT生成的accessToken和refreshToken能夠實現不同Controller乃至同一Controller中不同接口的權限單獨校驗。上一章鏈接如下&#xff1a; 從零搭建微服務項目Pr…

win安裝軟件

win安裝軟件 jdk安裝 jdk安裝 首先去官網下載適合系統版本的JDK&#xff0c;下載地址&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/index.html進入下載頁面&#xff0c;如下圖&#xff1a; 首先選擇&#xff1a;Accept License Agreement單選按鈕&…

Prompt-Tuning 提示詞微調

1. Hard Prompt 定義&#xff1a; Hard prompt 是一種更為具體和明確的提示&#xff0c;要求模型按照給定的信息生成精確的結果&#xff0c;通常用于需要模型提供準確答案的任務. 原理&#xff1a; Prompt Tuning原理如下圖所示&#xff1a;凍結主模型全部參數&#xff0c;在…

【Vue生命周期的演變:從Vue 2到Vue 3的深度剖析】

Vue生命周期的演變&#xff1a;從Vue 2到Vue 3的深度剖析 1. 生命周期鉤子的概念與意義 Vue框架通過生命周期鉤子函數使開發者可以在組件不同階段執行自定義邏輯。這些鉤子函數是Vue組件生命周期中的關鍵切入點&#xff0c;對于控制組件行為至關重要。 2. Vue 2中的生命周期…

java ai 圖像處理

Java AI 圖像處理 圖像處理是人工智能&#xff08;AI&#xff09;領域中非常重要的一個應用方向。通過使用Java編程語言和相應的庫&#xff0c;我們可以實現各種圖像處理任務&#xff0c;如圖像識別、圖像分類、圖像分割等。本文將介紹一些常見的圖像處理算法&#xff0c;并通過…

從 0~1 保姆級 詳細版 PostgreSQL 數據庫安裝教程

PostgreSQL數據庫安裝 PostgreSQL官網 【PostgreSQL官網】 | 【PostgreSQL安裝官網_Windows】 安裝步驟 step1&#xff1a; 選擇與電腦相對應的PostgreSQL版本進行下載。 step2&#xff1a; 雙擊打開剛才下載好的文件。 step3&#xff1a; 在彈出的setup窗口中點擊 …