作者mycircle (Careless whisper)
站内Visual_Basic
标题Re: [问题] 随变数增加而增加条件式
时间Sat Oct 13 04:34:34 2007
※ [本文转录自 Programming 看板]
作者: mycircle (Careless whisper) 站内: Programming
标题: Re: [问题] 随变数增加而增加条件式
时间: Sat Oct 13 04:30:09 2007
※ 引述《TonyQ (骨头)》之铭言:
: ※ 引述《琏琏 <[email protected]>, 看板: Programming》之铭言:
: : 这种一般都是用递回在做...
: : 比如说所有阶层子目录的列举。
: 它只举了一个情境,递回也只是其中一个逻辑解,
: 而且以这个情境来讲,递回不见得比较好用。XD
: 递回适合用来解 divide and conquer的问题,
: 如果他的子问题具有相依性(需要用到a...n的值),
: iterator配上 dynamic programming 会是比较好的解。
: 递回 跟 Iterator 之间的转换是演算法里面的其中一个部分,
: 基本上一般会建议能不用递回就不用递回,除非他有其必要性(够简单)。
: 递回流程难以掌握,也容易造成stack空间的溢出。
感谢回文和推文的网友 我把我的问题再说清楚一点好了
这个问题其实是一个老问题了 我拿来做练习而已
题目如下
如何列出1..n 的所有排列组合
例如 123 的所有排列组合 为 123 132 321 132 213 231 3! = 6种
可是如果12345 勒 就将近有120种排列组合 如果扩增到 1...10勒
就会有10!=3628800种
的排列组合
这时人脑便没办法一个一个将他展现出来了
而且此类问题可以归类为NP hard 问题 也就是数字规模增大
求解时间以及复杂度将会非线性的来增加
我一开始的想法是用暴力法 也就是所谓的穷举法一一把他列出
但我知道如网路上这位网友所提的概念
http://new-acos.blogspot.com/2007/07/blog-post_04.html
会比较节省演算的效率与记忆体
不过还是尝试写看看 因为我还是新手
两种穷举法的原始码列举如下(意思是差不多的) 我写在EXCEL 的VBA上
第一种 :
Dim y(5)
y(1) = 1
y(2) = 2
y(3) = 3
y(4) = 4
y(5) = 5
'==================================================
k = 1
For a = 1 To 5
For b = 1 To 5
For c = 1 To 5
For d = 1 To 5
For e = 1 To 5
If e <> d And e <> c And e <> b And e <> a Then
If d <> c And d <> b And d <> a Then
If c <> b And c <> a Then
If b <> a Then
Cells(k, 1) = y(a) & y(b) & y(c) & y(d) & y(e)
k = k + 1
End If
End If
End If
End If
Next
Next
Next
Next
Next
第二种
'=================================================
'==使用者输入
'=================================================
n = 5
s = 120
Dim y(5)
Dim U(120)
'=================================================
'==使用者输入
'=================================================
y(1) = 1
y(2) = 2
y(3) = 3
y(4) = 4
y(5) = 5
'==================================================
k = 1
For a = 1 To n '==使用者输入
For b = 1 To n
For c = 1 To n
For d = 1 To n
For e = 1 To n
Cells(k, 1) = y(a) & y(b) & y(c) & y(d) & y(e) '==使用者输入
k = k + 1
Next
Next
Next
Next
Next
'==================================================
For a = 1 To n ^ n
For i = 1 To n
For j = 1 To n
ten = Mid(Cells(a, 1), i, 1)
ten2 = Mid(Cells(a, 1), i + j, 1)
If Mid(Cells(a, 1), i, 1) = Mid(Cells(a, 1), i + j, 1) Then
Cells(a, 1) = ""
End If
Next
Next
Next
k = 1
For x = 1 To n ^ n
If Cells(x, 1) <> "" Then
U(k) = Cells(x, 1)
k = k + 1
End If
Next
For x = 1 To s
Cells(x, 2) = U(x)
Next
======== 问题来了 ======
在写的过程中 在第一种穷举法时
我本来是想写成动态的 也就是我希望当使用者只要改变N的大小 就可以了
但是我发现 以这个问题为例
像for next 以及 if then 的这些条件式 都会随着N的增加而增加
我就突然想到 如果以後碰到这类问题时该如何解决
如果我以後只要碰到 变数增加时 我的条件式也会增加时 我该如何处理
程式写得很糟 只是在写的过程中 想到这个问题
所以想问看看高手是如何处理这类问题的 感谢您抽空看完我的文章 谢谢
--
\(^▽^)/ 人客来坐
http://tomycircle.spaces.live.com/default.aspx
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.104.167.3
--
\(^▽^)/ 人客来坐
http://tomycircle.spaces.live.com/default.aspx
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.104.167.3