贝尔的数字
这个例子讨论了Julia编程语言中贝尔数计算的实现。
导言
钟数是组合学中的一个数字序列,它对于计算将一个集合划分为不相交子集的不同方式的数量很重要。
贝尔的号码 表示分割一组不同方法的数目 元素划分为非空子集。 这些数字用于概率论,统计学和数学的其他领域。
这些数字的例子:
- 
(空集只有一个分区) 
- 
- 
(例如,集 {a,b}可以分解为{{a},{b}}或{{a,b}})
- 
(这三个元素可以用五种不同的方式分解) 
功能的实现 bellnum
此函数采用整数 n 并计算相应的值 "贝尔的头号。"如果传递的值小于零,则函数抛出域错误(DomainError).
案件将在以下情况下进一步处理 n >= 2 由于钟形数字的初始值已经知道: .
"""
    bellnum(n)
Compute the ``n``th Bell number.
"""
function bellnum(n::Integer)
    if n < 0
        throw(DomainError(n)) # Выкидываем ошибку для недопустимых значений
    elseif n < 2
        return 1              # Для n=0 и n=1 значение равно 1
    end
    
    list = Vector{BigInt}(undef, n)   # Создаем вектор размером n
    list[1] = 1                       # Начальное значение
    for i = 2:n             # Для каждой строки от 2 до n
        for j = 1:i - 2     # Обновляем все промежуточные значения
            list[i - j - 1] += list[i - j]
        end
        list[i] = list[1] + list[i - 1]  # Получаем новое число Белла
    end
    return list[n]       # Возвращаем результат
end
接下来,创建类型的向量 Vector{BigInt} 长度 n. 我们使用的类型 BigInt 为了避免溢出,因为钟数字本身迅速增长。 最初,数组的第一个元素设置为一个,因为 .
接下来,主要工作是使用钟形三角形方法计算钟形数的值。 该算法建立一个三角形,其中每行是 i 包含 (i+1) 一个元素,每个元素都是序列中下一个数字的前兆。
周期内的基本步骤:
1. 嵌套循环更新列表中的中间值以获取钟形序列的新成员。
2. 在内循环之后,形成一个新的钟号值,该值存储在列表的最后一个元素中。
在输出处,函数返回 list[n],即最后计算的贝尔数正是序列第n个元素的答案。
使用函数
定义函数后,使用从1到50的简单循环,一次一个地调用我们的函数。 bellnum(i) 对于该范围内的每个i,并通过以下方式将结果输出到控制台 println().
for i in 1:50          # Проходим по числам от 1 до 50
    println(bellnum(i)) # Выводим значения чисел Белла
end
结论
我们回顾了Julia中计算贝尔数的算法的实现,了解了其逻辑,并通过输出一系列数字将其付诸实践。 这种方法使得在不使用递归的情况下很容易找到大的贝尔数值。 这在离散数学和组合结构分析问题中很有用.
该示例是使用[罗塞塔代码]的材料开发的(https://rosettacode.org/wiki/Bell_numbers )