找到最佳的组合方式,无需在swift中重复计算

时间:2016-09-03 15:01:47

标签: swift math factorial

我想为这种数学问题找到最快速的解决方案:

  

假设房间里有5个人。每个人都必须握手   彼此。它带来了多少种组合?

虽然我知道组合公式

enter image description here

我使用这个快速的阶乘函数:

func factorial(n: Int) -> Int {
    return n == 0 ? 1 : n * factorial(n — 1)
}

有没有办法建立一个函数,它不仅仅通过替换上面公式中的变量来计算组合?

注意:

我不认为这是最优化的方式:

let combinations = factorial(n: 5)/(factorial(n: 2)*factorial(n: 3)) // 10

1 个答案:

答案 0 :(得分:2)

#include<stdio.h> int prime(int p, int q, int r); int main(){ int n,c=0; scanf("%d",&n); for(int j=2;j<=n;j++){ int t=0; for(int i=1;i<=j;i++){ if(j%i==0){ t++; } } if(t==2){ //check whether J is prime or not // printf(" %d ",j); c=prime(n,j,0); //check whether j has any factors with N if(c!=0){ printf(" %d ",j); printf(" %d \n",c); } } } return 0; } int prime(int p,int q,int r){ if(p%q==0){ r++; prime(p/q,q,r); } else{ return r; } } 中选择public int addNumbers(int num1, int num2) { return num1 + num2; }项的方式的数量由下式给出 binomial coefficient kmultiplicative formula Pascal's triangle 对于非负nC(n, k),可以在Swift中实现

n

这比使用因子的公式“更好”

k

从某种意义上说,中间值不会变得那么大。 (但可以溢出,例如

/// Binimomial coefficient C(n, k) for non-negative integers n, k.
func binomial(n: Int, _ k: Int) -> Int {
    precondition(k >= 0 && n >= 0)
    if (k > n) { return 0 }
    var result = 1
    for i in 0 ..< min(k, n-k) {
        result = (result * (n - i))/(i + 1)
    }
    return result
}

超出了64位整数的范围!)

示例({{3}}):

C(n, k) = n! / (k! * (n-k)!)

在您的特殊情况下,C(70, 35) = 112186277816662845432 之间的握手次数 人是for n in 0...7 { print((0...n).map { k in binomial(n, k) }) } // Output: [1] [1, 1] [1, 2, 1] [1, 3, 3, 1] [1, 4, 6, 4, 1] [1, 5, 10, 10, 5, 1] [1, 6, 15, 20, 15, 6, 1] [1, 7, 21, 35, 35, 21, 7, 1] 。您可以使用上面的计算 功能或只是

n