【演算法系列】之遞歸演算法

来源:http://www.cnblogs.com/wangjiming/archive/2017/07/19/7203669.html
-Advertisement-
Play Games

1 概述 1 概述 本篇文章主要分享演算法部分——遞歸演算法,本文簡要講解幾個經典的遞歸算個發,即乘法階乘、漢諾塔和斐波那契數列。 2 講解部分 2 講解部分 2.1 乘法階乘 問題:求n! 分析: 0!=1; n!=nx(n-1)! code: 2.2 漢諾塔 問題:有三根桿子A,B,C。A桿上有N個 ...


1  概述

 本篇文章主要分享演算法部分——遞歸演算法,本文簡要講解幾個經典的遞歸算個發,即乘法階乘、漢諾塔和斐波那契數列。

2  講解部分

2.1  乘法階乘

問題:求n!

分析:

0!=1;

n!=nx(n-1)!

code:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConseDemo
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13            string inputParm=Console.ReadLine();//從控制台輸入參數
14            int n = Int32.Parse(inputParm);
15             Console.WriteLine(JieChengRecursive(n));
16             Console.Read();
17         }
18 
19         /// <summary>
20         /// 求n!
21         /// </summary>
22         /// <param name="n">傳入的參數n</param>
23         /// <returns>返回階乘n的結果</returns>
24        public static  int JieChengRecursive(int n)
25         {
26             int sum = 1;
27             if (n >= 2)
28             {
29                 sum = n * JieChengRecursive(n - 1);
30             }
31             else
32             {
33                 return 1;
34             }
35             return sum;
36         }
37     }
38 }

 

2.2  漢諾塔

問題:有三根桿子A,B,C。A桿上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C桿: 每次只能移動一個圓盤,大盤不能疊在小盤上面

   
    提示:可將圓盤臨時置於B桿,也可將從A桿移出的圓盤重新移回A桿,但都必須遵循上述兩條規則。
    問:如何移?最少要移動多少次?

 1      static void hannoi(int n, char from, char buffer, char to)
 2         {
 3             if (n == 1)
 4             {
 5                 Console.WriteLine("Move Disk:{0},from,{1},to,{2}", n, from, to);
 6             }
 7             else
 8             {
 9                 hannoi(n - 1, from, to, buffer);
10                 Console.WriteLine("Move Disk:{0},from,{1},to,{2}", n, from, to);
11                 hannoi(n - 1, buffer, from, to);
12             }
13         }

科普: 

最早發明這個問題的人是法國數學家愛德華·盧卡斯。

傳說印度某間寺院有三根柱子,上串64個金盤。寺院里的僧侶依照一個古老的預言,以上述規則移動這些盤子;預言說當這些盤子移動完畢,世界就會滅亡。這個傳說叫做梵天寺之塔問題(Tower of Brahma puzzle)。但不知道是盧卡斯自創的這個傳說,還是他受他人啟發。
若傳說屬實,僧侶們需要264 ? 1步才能完成這個任務;若他們每秒可完成一個盤子的移動,就需要5849億年才能完成。整個宇宙現在也不過137億年。
這個傳說有若幹變體:寺院換成修道院、僧侶換成修士等等。寺院的地點眾說紛紜,其中一說是位於越南的河內,所以被命名為“河內塔”。另外亦有“金盤是創世時所造”、“僧侶們每天移動一盤”之類的背景設定。
佛教中確實有“浮屠”(塔)這種建築;有些浮屠亦遵守上述規則而建。“河內塔”一名可能是由中南半島在殖民時期傳入歐洲的。

2.3  斐波那契數列

問題:斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
    特別指出:第0項是0,第1項是第一個1。這個數列從第二項開始,每一項都等於前兩項之和。

分析:

f(0)=0;

f(1)=1;

f(n)=f(n-1)+f(n-2);

code:

 1 int Fib(int n)
 2         {
 3             if (n < 1)
 4             {
 5                 return -1;
 6             }
 7             if (n == 1 || n == 2)
 8             {
 9                 return 1;
10             }
11             return Fib(n - 1) + Fib(n - 2);
12         }

 

2.4  總結

 關於遞歸演算法,註意兩個條件:(1)迴圈調用函數    (2)函數結束臨界條件

3   版權

 

  • 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
  • 博主網址:http://www.cnblogs.com/wangjiming/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分為原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]
  • 可以轉載該博客,但必須著名博客來源。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言:工作中看到項目組裡的大牛寫代碼大量的用到了StringUtils工具類來做字元串的操作,便學習整理了一下,方便查閱。 isEmpty(String str) 是否為空,空格字元為false isNotEmpty(String str) 是否為非空,空格字元為true isBlank(Strin ...
  • 給一個長為N的數列,有M次操作,每次操作是以下兩種之一: (1)將某連續一段同時改成一個數 (2)求數列中某連續一段的和 ...
  • 給一個長為N的數列,有M次操作,每次操作是以下兩種之一: (1)修改數列中的一個數 (2)求數列中某連續一段的和 ...
  • 一、JAVA高級併發 1.5JDK之後引入高級併發特性,大多數的特性在java.util.concurrent 包中,是專門用於多線程發編程的,充分利用了現代多處理器和多核心系統的功能以編寫大規模併發應用程式。主要包含原子量、併發集合、同步器、可重入鎖,並對線程池的構造提供了強力的支持。 二、線性池 ...
  • 非同步和多線程並不是一個同等關係,非同步是最終目的,多線程只是我們實現非同步的一種手段。非同步是當一個調用請求發送給被調用者,而調用者不用等待其結果的返回而可以做其它的事情。實現非同步可以採用多線程技術或則交給另外的進程來處理。 ...
  • 實現隨機驗證碼 ...
  • SSO英文全稱Single Sign On,單點登錄。SSO是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。它包括可以將這次主要的登錄映射到其他應用中用於同一個用戶的登錄的機制。它是目前比較流行的企業業務整合的解決方案之一。 ...
  • 最近幾年,函數式編程變得越來越流程,其代碼簡潔、副作用小、維護成本低等特點,使得許多其它的語言也開始支持函數式編程,比如`Java` 和 `C#`等。本文主要介紹一下函數式編程中的一個重要概念:`Monad`。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...