喜訊!公衆号作者受邀加入微信官方洗稿投訴合議小組
從1到100求和學算法思維(一)
從1到100求和學算法思維(二)
從1到100求和學算法思維(三)
從1到100求和學算法思維(四)
問題描述
前面幾篇文章為大家介紹了多種遞歸算法來實作1到100求和,但是這些算法都無一例外利用static關鍵詞定義了一個sum變量,即:
static int sum = 0;
此處是利用了靜态變量的特性完成和的累加操作,是否可以不使用這種類型的變量呢?本文将為大家介紹一種新的思維方式來求解。
解決方案
前面設計的所有的遞歸函數的傳回值類型都為void,是否可以讓遞歸函數有傳回值,嘗試着從這點入手來考慮解決問題。
如果每一次的遞歸函數都需要傳回值,那麼應該傳回什麼呢?
在數學的學習中,有一個非常重要的概念叫函數,即f(x)=y。其中x叫自變量,y叫因變量,意思就是任意的給定一個定義域内自變量的值,将其帶入到函數f中進行計算,就會得到因變量y的值。舉例如下:
假設有函數y=f(x)=2·x + 1,當x=1時,y=f(1)=2·1+1=3;當x=2時,y=f(2)=2·2+1=5;
我們嘗試着用函數的概念和思想來解決1到100的求和問題,假設現在有1到x的求和函數y=f(x),其中自變量x的值為1到100。至于這個函數具體是什麼,可以先不用管,隻需要了解這個函數所要表達的意義即可。
當x=1時 y=f(1)的值表示1到1的和。當x=2時 y=f(2)的值表示1到2的和。當x=100時 y=f(100)的值表示1到100的和。
有了上述的函數,就可以快速的表示1到100的求和了即f(100),接下來考察f(100)和f(99)之間的關系是什麼?
顯而易見:
f(100) = 100 + f(99)f(99) = 99 + f(98)···f(2) = 2 + f(1)f(1) = 1
從上面的遞推關系可以得出,如果要求f(100)就必須先求f(99),依次類推,最後必須要知道f(1)的值,而f(1)=1,是以反過來即可知道f(100)。
這種思想簡單描述就是:
f(100)f(99)···f(2)f(1) // 遞歸結束,傳回。
這種思維方式是否和第二篇文章介紹的思維方式極其相似,在第二篇文章中,讓整數n從100開始一直遞減到1,然後才開始列印1,2,···,100。這兩種情況雖然形式不同,但是思維的本質是一緻的,是以學會了思維就可以解決無窮多的問題。
程式設計語言中的函數的概念和數學中函數的概念是極其的相似,可以将函數的形參了解為自變量x,而函數的傳回值了解為因變量y。結合上面得出的遞推關系y=f(x) = x + f(x-1),可以很快寫出下面的代碼:
int foo(int x){return x + foo(x-1); // 此處函數的傳回值就是因變量y}
由于遞歸函數必須有結束條件否則會陷入無限循環,是以加上其結束條件即可,其Java版本完整的代碼為:
至此,我們消除了static類型的sum變量,圓滿的解決了問題。
結語
本文最大的貢獻就是将數學中函數的思想引入到算法思維中來解決問題,建立函數的模型,引出遞推關系,進而采用遞歸函數來程式設計實作。這種利用數學函數的思維來解決問題的思維方式是非常常見的,也是非常重要的一種思維方式。同時,有了函數的思維,還要學會其程式設計實作思路。
更多精彩文章:
聊一聊程式設計的本質
【Maven冷知識】Compiler插件
【Maven冷知識】java.version
什麼是機器學習
關于網頁首頁設計的一點思考
新手小白應該如何學習MUI
聊一聊where2go團隊做什麼
聊一聊程式設計的本質
深入了解浏覽器核心 - 概述
深入了解浏覽器核心 - 浏覽器核心介紹
深入了解浏覽器核心 - 浏覽器核心依賴關系
python快速求解不定積分和定積分
AI告訴你張無忌最愛的竟是...
Jupyter快速編輯高大上數學公式 泰勒展開式
Jupyter快速編輯高大上數學公式 常見希臘字母
基本初等函數 指數函數
基本初等函數 指數函數 代碼篇
聊一聊JavaWeb面試
聊一聊單片機和伺服器
50行代碼實作簡單的網站伺服器
50行代碼實作網站伺服器 2
50行代碼實作網站伺服器 3
Tomcat源碼分析之 doGet方法(一)
Tomcat源碼分析之 doGet方法(二)
Tomcat源碼分析之 doGet方法(三)
Tomcat源碼分析之 doGet方法(四)
Tomcat源碼分析之中文亂碼(一)
一種基于狀态機的 DOM 樹生成技術(1)
一種基于狀态機的 DOM 樹生成技術(2)
where2go 團隊
微信号:算法與程式設計之美