关于解多元一次方程递归算法的引申问题

mail2491207 2006-06-01 07:27:08
递归算法的运用(代码为网上转载)

Private Sub Command2_Click() '演示求X1+X2+X3+X4+X5=10非负整数解
 Text1.Text = ""
 Dim answer As String
  answer = GETRESULT(5, 10, False) '赋值
 Dim temp
  temp = Split(answer, vbCrLf)
 For i = 0 To UBound(temp)
  temp(i) = "解" & i + 1 & ":" & vbTab & temp(i) 'add index
 Next
 answer = Join(temp, vbCrLf)
 Text1.Text = "方程 X1+X2+X3+X4+X5=10 共有 " & UBound(Split(answer, vbCrLf)) + 1 & " 个非零整数解:" & v bCrLf & answer 'show all answer in textbox
End Sub

'求解函数
Function GETRESULT(ByVal n As Integer, ByVal SUM As Integer, Optional allowzero As Boolean = True) As String
 Dim temp() As String, i As Long
 If n = 2 Then '二元方程
  If allowzero = True Then
   ReDim temp(SUM)
   For i = 1 To SUM ' allow zero
    temp(i) = "X1=" & i & ",X2=" & SUM - i
   Next
   GETRESULT = Join(temp, vbCrLf)
   Erase temp
  Else
   ReDim temp(1 To SUM - 1) 'forbid zero
   For i = 1 To SUM - 1
    temp(i) = "X1=" & i & ",X2=" & SUM - i
   Next
   GETRESULT = Join(temp, vbCrLf)
   Erase temp
  End If
 End If
 If n > 2 Then
  If allowzero = True Then
   ReDim temp(SUM)
   For i = SUM To 0 Step -1 ' allow zero
  temp(i) = Replace(GETRESULT(n - 1, i, True), vbCrLf, ",X" & n & "=" & SUM - i & vbCrLf) & ",X" & n & "=" & SUM - i
   Next
   GETRESULT = Join(temp, vbCrLf)
   Erase temp
  Else
   If SUM < n Then MsgBox "无解!": Exit Function '无解情况
   ReDim temp(1 To SUM - n + 1) 'not allow zero
   For i = 1 To SUM - n + 1
temp(i) = Replace(GETRESULT(n - 1, SUM - i, False), vbCrLf, ",X" & n & "=" & i & vbCrLf) & ",X" & n & "=" & i '递归
   Next
   GETRESULT = Join(temp, vbCrLf)
   Erase temp
   End If
 End If
End Function

--------------
 以上这段代码是求方程的解(网上转)

 我觉得很好,但没怎么看懂

 但是因为没有限定每个变量的取值范围,循环很耗时

 我想假如能在里面加入每个变量允许的取值范围的话,循环时间能大大减少

 但是我不知道,从那入手

 大家帮我看看,就以x1取值只能为3到5

 x2只能从2到4(我想其他的都一样)举例把

 另外我想定义一个存放所有可能解的二维数组,比如 JIE(i,j)

 i代表所有解的个数,j代表所有变量的个数

 我想把所有的解存入这个数组中进行下一步的分析操作

以及定义一个变量来计算循环所用时间

 请各位高手帮我出个主意吧
 谢谢了
...全文
256 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
northwolves 2006-06-02
  • 打赏
  • 举报
回复
首先感谢楼主的夸奖,原文见:http://blog.csdn.net/northwolves/archive/2004/02/01/19587.aspx

原文是基于01排列组合进行递归的,原理见此帖:http://topic.csdn.net/t/20031226/21/2607772.html

真正多元一次方程组的求解一般采取高斯消元法,参见:

http://topic.csdn.net/t/20040812/11/3266909.html

你的问题估计递归也能解决。
mail2491207 2006-06-02
  • 打赏
  • 举报
回复
northwolves(狼行天下)
你好
我看了你说的这个方程组求解的代码
但是里面是求解方程组得
而且最后值得形式也是以字符串的形式输出
我想是求解多元一次方程的不定解,而且系数都为1,比如X1+X2+X3+X4+X5=20
我想把所有的解都存入一个二维数组中,比如JIE(i,j)
i代表所有解的个数,j代表所有变量的个数,比如jie(1,1)代表抵一个解的时候X1的值
第一楼的代码能实现求解的功能,但是我不知道怎样把解存入这样的数组中
另外我想最好能在代码中能够设置每个变量的取值范围,这样减少循环时间
请问如何实现阿
还请您能费心指导下
mail2491207 2006-06-02
  • 打赏
  • 举报
回复
对阿
我也觉得递归是求解这类问题的办法
但是由于我初学vb不久
所以很多方面还是不理解
还请northwolves指导阿

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧