`
eimhee
  • 浏览: 2153171 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

非递归解决组合问题

阅读更多

从m 个互不相同元素中取 n 个元素,一般选用递归或回溯算法解决,本文旨在利用进制转换的方法达到这一目的。代码如下

 

 

Sub GETALL(ByVal num As Integer, ByRef x As Variant, ByRef RESULT() As String, Optional ByRef all As Long)

Dim A() As String, b() As Integer '临时数组
Dim n As Integer ' 数组元素个数
Dim i As Long '循环变量
Dim TEMP As Long '二进制转换中间变量
Dim num2 As Integer '中间计数变量
n = UBound(x) - LBound(x) + 1 '数组元素个数
If num > n Then MsgBox "ERR!", vbInformation, "WARNING": Exit Sub
ReDim b(0 To n - 1)
all = 0
For i = 0 To 2 ^ n - 1 '循环
TEMP = i
num2 = 0
For j = 0 To n - 1 '转换为二进制
b(j) = TEMP And 1 '0 or 1
TEMP = TEMP \ 2
If b(j) = 1 Then
num2 = num2 + 1
ReDim Preserve A(1 To num2)
A(num2) = x(LBound(x) + j)
End If
Next
If num2 = num Then
all = all + 1
ReDim Preserve RESULT(1 To all)
RESULT(all) = Join(A, ",")   '结果保存
Debug.Print RESULT(all) '输出
End If
Next
Debug.Print "从 " & n & " 个元素的数组中选 " & num; " 个元素, 共 " & all & "种组合!"
End Sub

Private Sub Command1_Click()
Dim x, i As Integer
Dim out() As String
x = Array(1, 2, 3, 4, 5, 6, 7, 8)
GETALL 4, x, out
End Sub

输出:

1,2,3,4
1,2,3,5
1,2,4,5
1,3,4,5
2,3,4,5
1,2,3,6
1,2,4,6
1,3,4,6
2,3,4,6
1,2,5,6
1,3,5,6
2,3,5,6
1,4,5,6
2,4,5,6
3,4,5,6
1,2,3,7
1,2,4,7
1,3,4,7
2,3,4,7
1,2,5,7
1,3,5,7
2,3,5,7
1,4,5,7
2,4,5,7
3,4,5,7
1,2,6,7
1,3,6,7
2,3,6,7
1,4,6,7
2,4,6,7
3,4,6,7
1,5,6,7
2,5,6,7
3,5,6,7
4,5,6,7
1,2,3,8
1,2,4,8
1,3,4,8
2,3,4,8
1,2,5,8
1,3,5,8
2,3,5,8
1,4,5,8
2,4,5,8
3,4,5,8
1,2,6,8
1,3,6,8
2,3,6,8
1,4,6,8
2,4,6,8
3,4,6,8
1,5,6,8
2,5,6,8
3,5,6,8
4,5,6,8
1,2,7,8
1,3,7,8
2,3,7,8
1,4,7,8
2,4,7,8
3,4,7,8
1,5,7,8
2,5,7,8
3,5,7,8
4,5,7,8
1,6,7,8
2,6,7,8
3,6,7,8
4,6,7,8
5,6,7,8
从 8 个元素的数组中选 4 个元素, 共 70种组合!


但从运算速度上来说,本方法可能要比递归,回溯慢些。

分享到:
评论

相关推荐

    N选M的所有组合(递归与非递归实现)

    在计算机科学中,组合问题是一种常见的算法问题,...理解并掌握递归和非递归方法对于提升编程技能和解决实际问题都至关重要。无论是选择递归的优雅还是非递归的效率,关键在于根据具体问题和性能需求来选取合适的方法。

    合并排序递归和非递归算法

    这个过程既可以用递归方式实现,也可以用非递归方式实现。 首先,让我们来看看递归版本的合并排序。递归算法的核心在于它的自相似性,即一个问题的解可以通过解决规模更小的相同问题得到。在合并排序中,我们首先将...

    简单背包问题算法(非递归实现的)

    算法实现简单背包问题非递归解决方案 本文档将详细介绍简单背包问题的非递归实现算法。该算法旨在解决背包问题,即如何在有限的背包容量下,选择合适的物品,使得总价值达到最大。 算法原理 简单背包问题可以描述...

    合并排序算法非递归形式源码

    它的主要思想是采用分治法(Divide and Conquer)将大问题分解为小问题来解决。在这个过程中,我们将一个大的序列拆分为两个或多个小的序列,对这些小序列分别进行排序,然后将排序后的小序列合并成一个大的有序序列...

    C语言实现N皇后问题非递归求解

    N皇后问题是一个经典的计算机科学问题,...总的来说,C语言实现的非递归N皇后问题解法避免了递归可能导致的栈溢出问题,同时减少了空间需求。这种方法虽然简单,但能够有效地解决问题,体现了算法设计的简洁性和效率。

    Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例

    在实际应用中,选择使用递归还是非递归方法取决于具体问题的复杂性和对效率的要求。当问题规模较小时,递归方法是很好的选择,因为它简化了代码;但当问题规模很大时,为了减少内存的使用和避免潜在的栈溢出,迭代...

    N个数全排列的非递归算法

    在描述中提到了一个博客链接,虽然具体内容没有给出,但通常博主会详细解释如何用非递归的方式解决全排列问题。非递归算法通常采用迭代或回溯的方式来完成,这种方式相对于递归可能会更节省内存,因为递归深度过大...

    非递归的归并排序(一种优排序)

    在计算机科学中,分治法是一种将大问题分解成小问题来解决的策略。归并排序利用这一策略,将一个大数组分成两个小数组,分别对它们进行排序,然后将排好序的小数组合并成一个大的有序数组。 非递归的归并排序与传统...

    Ackermann 递归与非递归两种解法

    Ackermann 函数是一种著名的计算问题,...在编程中,特别是对于计算复杂度高的函数,寻找非递归解决方案往往能提高程序的效率。在 Visual C++ 6.0 中实现 Ackermann 函数,可以作为深入学习递归和算法优化的一个实例。

    使用分治策略递归和非递归和递推算法解决循环赛日程表课程设计报告.docx

    综上,三种算法在解决循环赛日程表问题时,虽然都能达到正确性,但在效率上递归算法在某些方面可能优于非递归算法,但由于递归的栈空间消耗,非递归算法在处理大规模问题时可能更优。递推算法则介于两者之间,提供了...

    Java实现用递归算法和非递归算法求解斐波那契数列问题.docx

    为了解决这个问题,我们可以使用非递归算法来求解斐波那契数列问题。 非递归算法的基本思想是使用一个数组来保存斐波那契数列中的每个数,然后使用循环来计算每个数。上面的代码中,我们定义了一个非递归函数 ...

    bag_0-1背包问题递归非递归动态规划_

    2. **非递归解法(动态规划)**:非递归版本会避免重复计算,提高效率。我们可以从第一件物品开始,依次处理每个物品,对于每个物品,遍历所有可能的容量,更新`dp`数组。这个过程是自底向上的,即先解决小问题,再...

    递归求解几类排列组合问题

    下面我们将通过四个例子来演示如何使用递归法来解决排列组合问题: 一、类循环组合排列 在这个问题中,我们需要生成所有可能的二进制数。样本输入为4 2,样本输出为0000 0001 0010 0011 0100 0101 0110 0111 1000 ...

    使用分治策略递归和非递归和递推算法解决循环赛日程表课程设计报告.pdf

    分治法是一种解决问题的策略,它将大问题分解为较小的子问题来解决,然后将子问题的解组合成原问题的解。在循环赛日程表问题中,可以利用分治思想,将n个运动员分为两组,每组n/2个,分别安排他们的比赛,然后再将这...

    算法实验 数塔 成绩划分 投资 杨辉三角(非递归实现)等等

    这个问题的解决通常用递归函数实现,但也有可能用非递归方式解决,比如使用栈数据结构。 "成绩划分"可能是关于数据处理和统计分析的问题。在C++中,可以通过排序和遍历数组来实现成绩的分段,例如将成绩分为优秀、...

    归并分类 计算机算法 c/c++语言 递归和非递归

    在这个上下文中,我们将深入探讨归并排序的计算机算法,以及如何在C/C++编程语言中实现其递归和非递归版本。 **归并排序的基本思想** 归并排序的核心是将一个大数组分为两个或更多个小数组,分别对这些小数组进行...

    递归九讲2021 7-9.zip

    在这一章中,主要探讨了如何使用递归解决排列类问题。排列是指从n个不同元素中取出m个元素的所有可能的组合方式,而递归是一种自然的方式来处理这类问题。通过定义基本情况(即最简单的排列)和递归步骤(将问题分解...

    递归算法专题ppt

    递归算法的关键在于识别出能够通过递归解决的问题,并找到递归的基本情况(即递归的终止条件)。 **递归的基本概念:** 1. **边界值(Base Case)**:递归的终止条件,通常是最简单的情况,可以直接得到答案。 2. ...

    实验二递归与分治

    在集合划分问题中,我们使用递归思想来解决问题,通过将集合分解成小问题,然后将小问题的解组合起来,解决原始问题。 实验结果 通过本实验,我们了解了递归算法和分治法的基本思想和实现方法。我们实现了快速排序...

    大学计算机程序与递归组合抽象与构造PPT课件.pptx

    在递归的概念中,程序能够调用自身来解决更复杂的问题,这是抽象和组合的进一步延伸。递归通过将问题分解为相同或相似的子问题来解决,每个子问题再进一步分解,直到达到可以直接解决的简单情况。递归在算法设计中...

Global site tag (gtag.js) - Google Analytics