iOS中排列組合算法的使用小結(jié)
前言
最近在項(xiàng)目中用到了排列組合計(jì)算,雖然比較簡單,但是整個(gè)學(xué)習(xí)過程還是要記錄下來的,以便以后可以吸取經(jīng)驗(yàn)。
一般來說,排列組合就等于搜索。
注意點(diǎn):
1.去重復(fù):規(guī)定子集順序必須升序;
2.候選數(shù)組的結(jié)果處理。必須深拷貝,否則最后的結(jié)果集里全是空的(加了一堆指針)。
3.在寫遞歸的時(shí)候(DFS:深度優(yōu)先搜索),思路是先把以 1 開頭的都找出來,再把 2 開頭的都找出來 …… 所有在遞歸之前做過的事情,之后都要把它抹回來。遞歸做的事情能一句話描述清楚。遞歸就是不斷地把規(guī)模變小,但是都做的一件事情。
方法如下:
最開始的思路是用階乘去解決排列組合的問題,所以就想到了遞歸。
long arithmetic(int n) { if (n>1) { return n*arithmetic(n-1); }else if (n == 1){ return 1; }else{ return 1; } }
但是遞歸的話,有一個(gè)弊端,數(shù)字達(dá)到一定程度的時(shí)候,它會(huì)出現(xiàn)值越界的情況,就算是用long long類型,也還是會(huì)出現(xiàn)越界的情況。所以用階乘的這種方式,被暫時(shí)擱置。
想到的第二種思路是用for循環(huán)去解決問題。僅僅只用到排列這種算法,階乘還是非用不可得,但是就組合而言,完全可以換另一種方式去解決。
解決的思路就是為了不讓數(shù)字值越界,可以讓分子和分母約分后,再乘下一個(gè)分子,再和分母約分。以此類推。話不多說,直接上代碼:
/** 雙色球 普通選注 */ - (long)lotterySSQPTRecursiveWithRedBalls:(NSUInteger)redBalls blueBalls:(NSUInteger)blueBalls{ if (redBalls > 5 && blueBalls > 0) { if (redBalls == 6) { return blueBalls; }else{ NSUInteger count = (redBalls-6 > 6) ? 6 : redBalls-6; long number = 1; long molecular = 1; long denominator = 1; for (int i = 0; i < count; i++) { molecular = molecular*(redBalls-i); denominator = denominator * (i+1); number = (molecular*number)/denominator; molecular = 1; denominator = 1; } number = number*blueBalls; return number; } }else{ return 0; } }
相比于直接用階乘,個(gè)人覺得還是for循環(huán)更好一些。如果有什么更好的解決思路,歡迎各位留言!
想要看Demo的小伙伴,點(diǎn)擊此處傳送 (本地下載)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
舉例講解iOS應(yīng)用開發(fā)中hitTest觸摸事件的編寫方法
這篇文章主要介紹了舉例講解iOS應(yīng)用開發(fā)中hitTest觸摸事件的編寫方法,重點(diǎn)講解了兩個(gè)view之間的事件傳遞,需要的朋友可以參考下2016-04-04iOS定時(shí)器的選擇CADisplayLink NSTimer和GCD使用
這篇文章主要為大家介紹了iOS定時(shí)器的選擇CADisplayLink NSTimer和GCD使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Objective-C基礎(chǔ) 自定義對(duì)象歸檔詳解及簡單實(shí)例
這篇文章主要介紹了Objective-C基礎(chǔ) 自定義對(duì)象歸檔詳解及簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04詳解ios監(jiān)聽reloadData刷新列表完畢的時(shí)機(jī)
這篇文章主要介紹了詳解ios監(jiān)聽reloadData刷新列表完畢的時(shí)機(jī),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11