游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2634|回复: 5

求救:请教一个困扰了我很久的小问题!~急

[复制链接]

8

主题

68

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2005-3-20 15:05:00 | 显示全部楼层 |阅读模式
首先感谢各位大侠能看此贴,谢谢!
问题:有一个变量x,当x = 1 时执行以下代码:
         for
             ...
         next

         当x = 2 时执行以下代码:
         for
             for
                 ...
             next
         next

         当x = 3 时执行以下代码:
         for
             for
                 for
                     ...
                 next
             next
         next
         ...
         ...
         当x = N 时执行以下操作:
         N个for ...next且要求循环一层层内嵌(如上)

解决方法:
        if x = 1 then
            for
                ...
            next
        elseif x = 2 then
            for
                for
                    ...
                next
            next
        elseif x = 3 then
           .....
        end if
      我想这样也太烦了把,有没有简便的方法。谢谢! [em7]

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-3-20 19:59:00 | 显示全部楼层

Re:求救:请教一个困扰了我很久的小问题!~急

递归!
function samp(int ns)
if (ns<0) exit function
for
   ...
   samp(ns-1)
   ...
next
end function

程序中
samp(n)

最好基础扎实!要不然递归函数可是不好玩得!

8

主题

68

帖子

68

积分

注册会员

Rank: 2

积分
68
 楼主| 发表于 2005-3-22 14:14:00 | 显示全部楼层

Re: 求救:请教一个困扰了我很久的小问题!~急

感谢lights兄提供的方法,但我用此方法试了一下,还是解决不了我的实际问题。
真实的题目(我本想自己解决,可我递归学的又差,只好...):

有6个一位数,将它组成一个等式,是等式成立(不能重复使用)。如189975组成78-59=19
就是“开心词典”的题目,我想设计一个程序,只要你输入6个数,经过一系列算法,就能的出答案(有+ - * /四种运算符,可能不
只一个答案),我的思路如下:

1.首先,确定3个数的位数,即第一个数是几位数?第二个数是几位数?第三个数是几位数?
        这个算法我已解决,用了3个循环,稍加修改就适用于任意的数,如:有3个一位数,程序得出的结果是111即 一位数 + 一位数 = 一       

位数等。

2.然后,确定具体是什么数,在这一步我卡住了,但只要解决了就作好了。

3.最后,不难扩展成输入任意个一位数( >=3 ),即可得出答案。


下面是我的程序:

当是3个数时(用3个数组成)
For first = 3 To 1 Step -1  '//操作数1的位数
    For second = 3 - first To 1 Step -1  '//操作数2的位数
        For third = 3 - first - second To 1 Step -1 '//结果的位数
            If first + second + third = 3 Then
               '//3个数时只有一种组合:111
               MsgBox("组合为:" & first & second & third, MsgBoxStyle.OKOnly, "total")
               
               For x = 1 To 3 '//开始组成第1个数
                   For y = 1 To 3 '//开始组成第2个数
                                          If x <> y Then
                           For z = 1 to 3 '//开始组成第3个数
                               If z <> x And z <> y Then
                                  '//判断num(x) + num(y) = num(z) ?
                                  '//判断num(x) - num(y) = num(z) ?
                                  '//判断num(x) * num(y) = num(z) ?
                                  '//判断num(x) / num(y) = num(z) ?
                               End if
                           Next
                        End if
                   Next
               Next
            End If
        Next
    Next
Next

当是6个数时
For first = 6 To 1 Step -1  '//操作数1的位数
    For second = 6 - first To 1 Step -1  '//操作数2的位数
        For third = 6 - first - second To 1 Step -1 '//结果的位数
            If first + second + third = 6 Then
               '//6个数时有十种组合:411 / 321 / 312 / 231 / 222 / 213 / 141 / 132 / 123 / 114               
               MsgBox("组合为:" & first & second & third, MsgBoxStyle.OKOnly, "total")
               
               For x = 1 To 6 '//开始组成第1个数,它由4个数构成
                   For xx = 1 To 6
                       For xxx = 1 To 6
                           For xxxx = 1 To 6'//第一个完成
                               For y = 1 To 6'//第二个数也是一个For...Next循环,且由一个数构成它就内嵌循环几次
                                   If y <> xxxx And y <> xxx And y <> xx And y <> x Then
                                      For z = 1 To 6 '//第三个数也是一个For...Next循环,且由一个数构成它就内嵌循环几次
                                        If z <> y And z <> xxxx And z <> xxx And z <> xx And z <> x Then
                                             '//判断num(x)*1000+num(xx)*100+num(xxx)*10 + num(y) = num(z) ?
                                             '//判断num(x)*1000+num(xx)*100+num(xxx)*10 + num(x) - num(y) = num(z) ?
                                             '//判断num(x)*1000+num(xx)*100+num(xxx)*10 + num(x) * num(y) = num(z) ?
                                             '//判断num(x)*1000+num(xx)*100+num(xxx)*10 + num(x) / num(y) = num(z) ?
                                        End if
                                      Next
                                   End if
                               Next
                           Next
                       Next
                   Next
               Next
            End If
        Next
    Next
Next

是否能编一个通用过程能同时满足任意组合的要求(难道根本就编不起来?是我思考的方向错了?还是...)?请高手们赐教。 [em24]

8

主题

68

帖子

68

积分

注册会员

Rank: 2

积分
68
 楼主| 发表于 2005-3-22 14:21:00 | 显示全部楼层

Re: 求救:请教一个困扰了我很久的小问题!~急

怎么粘贴上的代码这么乱?算了,发个文本文件吧,这样代码就不乱。 [em3] [em7]

sf_2005322142141.rar

1.29 KB, 下载次数:

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-3-23 15:21:00 | 显示全部楼层

Re:求救:请教一个困扰了我很久的小问题!~急

很简单!关键问题在于那六个数是要两两一组分吗?
如果不是,其运算量可是非常大!
问题分解成几个循环
1.排列循环,该循环依次排出等号左边的一组数和等号右边的数。
2.算术循环,该循环按各种计算依次计算左边的一组数和右边的数是否相等!?
第2个循环是第一个循环的子循环!
第一个循环的设计稍微复杂一点。你的思路对!先要有一层分成几个数的循环,
  然后就用一个递归去拆分!
第二个循环就是穿插运算!有运算优先级和括号的话!算法和运算回复杂一点点!

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-3-23 15:24:00 | 显示全部楼层

Re:求救:请教一个困扰了我很久的小问题!~急

补充,其实你第一循环如果不排除重复项的不同位置排列!其实是不需要在第二个循环中考虑括号和运算优先级!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-24 23:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表