溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

iOS中排列組合算法的使用小結(jié)

發(fā)布時(shí)間:2020-10-02 15:40:19 來(lái)源:腳本之家 閱讀:114 作者:橘子star 欄目:移動(dòng)開發(fā)

前言

最近在項(xiàng)目中用到了排列組合計(jì)算,雖然比較簡(jiǎn)單,但是整個(gè)學(xué)習(xí)過程還是要記錄下來(lái)的,以便以后可以吸取經(jīng)驗(yàn)。

一般來(lái)說,排列組合就等于搜索。

注意點(diǎn):

1.去重復(fù):規(guī)定子集順序必須升序;

2.候選數(shù)組的結(jié)果處理。必須深拷貝,否則最后的結(jié)果集里全是空的(加了一堆指針)。

3.在寫遞歸的時(shí)候(DFS:深度優(yōu)先搜索),思路是先把以 1 開頭的都找出來(lái),再把 2 開頭的都找出來(lái) …… 所有在遞歸之前做過的事情,之后都要把它抹回來(lái)。遞歸做的事情能一句話描述清楚。遞歸就是不斷地把規(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é)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI