佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

12
返回列表 发新帖
楼主: eh2001

Recursive vs. Looping (WHILE, FOR.. etc)

  [复制链接]
发表于 18-8-2011 01:03 AM | 显示全部楼层
Recursive 長期 looping 會 stack overflow 的.
馬拉棧 发表于 8-7-2011 09:18 PM


如果你设计到这样。就算用loop 或while, 也一样overflow .
还是关心好程式怎么设计吧。
回复

使用道具 举报


ADVERTISEMENT

发表于 18-8-2011 09:21 AM | 显示全部楼层
回复  hooi1983

可能是小弟的心理作用吧,以前读书时,我写IF,老师给少分,写case的比较高分,还 ...
forexen 发表于 4-7-2011 06:05 PM


可能你用错地方了
回复

使用道具 举报

发表于 18-8-2011 09:52 AM | 显示全部楼层
本帖最后由 geekman 于 18-8-2011 10:00 AM 编辑

回复 16# forexen

这是十分错误的理解,根据你的说法,以下的程式绝对可以拿100分:

  1. void main(void)
  2. {
  3.    return;
  4. }
复制代码
又简短又铁定没有bug,简直是完美的Bullet Proof!堪称史上最经典的Program。

其实导师看重的是简洁整齐,容易看懂(全班40几个学生,每个都写得乱七八糟,会让他/她寿命急剧缩短的),导师要求的是streight to the point的coding,不拖泥带水,而不是把大量步骤超浓缩成一行,然后看的人还得在脑海里拆解还原那些超浓缩的coding才能看得懂,那只会让导师不耐烦的给你打上一个大大的D-评分。简单的说就是:以简洁有效率的方法来编写你的代码。

之所以给switch(case 是 switch 里的 keyword,并不是该分歧架构体正确的名称)打较高的分是因为switch比一大堆if…else更整洁明了,能够让任何必须解读你的coding的其他programmer更容易理解你的代码。Programmer并不是Rambo,并不提倡个人英雄主义的,所以写Coding的时候要多为他人着想。

举个例子:

  1. if(var == 1)
  2. {
  3. ...
  4. }
  5. else if(var == 2)
  6. {
  7. ...
  8.    if(string == "Hello")
  9.     {
  10.         output(string + " world!");
  11.     }
  12.     else
  13.     {
  14.        output("Please say Hello!");
  15.     }
  16. }
  17. else if(var == 3)
  18. {
  19.    ...
  20. }
复制代码

  1. switch(var)
  2. {
  3.    case 1: ...
  4.             break;
  5.    case 2: ...
  6.             if(string == "Hello")
  7.             {
  8.                 output(string + " world!");
  9.             }
  10.             else
  11.             {
  12.                 output("Please say Hello!");
  13.             }
  14.             break;
  15.     case 3: ...
  16.             break;
  17. }
复制代码
switch就显得整齐多了,就算有nested if,也不会显得那么杂乱。存在就是合理,既然当年电脑先驱们创造出switch而不是依赖if...else,当然有他们的理由,问题是你们有没有去理解这个理由,还是盲目的认为短就是高分?(事实上,短会被人鄙视的哦

最后再重申:switch适用于条件为single numeric的检测例如var == 1,var==2,var==‘4’,而if...else则适用于non numeric分歧检测,例如string == “Hello”,在适当的地方使用适当的方式,那才是获得高分的理由。
回复

使用道具 举报

 楼主| 发表于 18-8-2011 10:00 AM | 显示全部楼层
回复  forexen

这是十分错误的理解,根据你的说法,以下的程式绝对可以拿100分:
  • void main(void)
  • {
  •    return;
  • }

复制代码
又简短又铁定没有bug,简直是完美的Bullet Proof!堪称史上最经典的Program。
geekman 发表于 18-8-2011 09:52 AM


LOL!!!!!!!!!!!!! 我欣赏你!!!!!!!!!!!!!!!!!!!!!! {:3_84:}
回复

使用道具 举报

发表于 31-12-2011 07:50 PM | 显示全部楼层
回复  forexen

最后再重申:switch适用于条件为single numeric的检测例如var == 1,var==2,var==‘4’,而if...else则适用于non numeric分歧检测,例如string == “Hello”,在适当的地方使用适当的方式,那才是获得高分的理由。
geekman 发表于 18-8-2011 09:52 AM



你给的non numeric分歧检测好像有点不恰当因为switch也能 string == “Hello” 啊


比如多重compare,如以下:
回复

使用道具 举报

发表于 12-1-2012 10:40 AM | 显示全部楼层
本帖最后由 苦瓜汤 于 12-1-2012 10:41 AM 编辑

回复 16# forexen

回复 14# forexen

你觉得这个比较高分,
  1. if (animal == "golden retriever" || animal == "labrado"){
  2. bark();
  3. }else if(animal == "pigeon" || animal == "eagle" || animal == "sparrow"){
  4. chirps();
  5. }else if(animal == "siamese" || animal == "persian"){
  6. meow();
  7. }else{
  8. talk();
  9. }
复制代码
还是这个?
  1. switch(animal){
  2.         case "golden retriever":
  3.         case "labrado":
  4.                 bark();
  5.                 break;
  6.         case "pigeon":
  7.         case "eagle":
  8.         case "sparrow":
  9.                 chirps();
  10.                 break;
  11.         case "siamese":
  12.         case "persian":
  13.                 meow();
  14.                 break;
  15.         default:
  16.                 talk();
  17. }
复制代码
回复

使用道具 举报

Follow Us
发表于 12-1-2012 04:36 PM | 显示全部楼层
都是背多分.....
回复

使用道具 举报

发表于 8-10-2012 09:32 PM | 显示全部楼层
最好用 iteration loop
回复

使用道具 举报


ADVERTISEMENT

发表于 23-11-2012 12:08 AM | 显示全部楼层
不同的时候时候适合不同的做法。

do {
   至少做一次
} while ( 检查条件 )

==================
while ( 检查条件 ) {
   条件符合才做
}

==================
for ( i = 0 ; i < 固定或半固定次数 ; i ++ ) {
   处理
}


==================
foreach ( i in arrayi ) {
    处理  i, 属于 arrayi 的一个单位
}

==================
而 recursive 大多使用多层、蜘蛛网状式搜查

int loopcount ( icount, data ) {
   if ( data ... ) {
         icount = loopcount( icount+ 1, data[+1] ) ;
   } else {

   }
   return icount ;
}

==================
不同的分叉、判断也需要用不同的方法

if ( a == 1 ) {
   if ( b == 2 ) {
            处理 a = 1, b != 2
   } else if ( c == 3 ) {
                 处理 a=1, b=2, c=3
            } // endif c
   } // endif b
} // endif a

==================
switch ( sel ) {
   case " 1 " :
          选择 1
            break;

   case " 2 " :
          选择 2
            break;

   case " 3 " :
          选择 3
            break;

   default :
       其他
       break;
}

本帖最后由 flashang 于 23-11-2012 12:22 AM 编辑

回复

使用道具 举报

发表于 14-12-2012 11:36 AM | 显示全部楼层
给我是用LOOP
Recursion是很方便但是有时候数据太大会导致Stack Overflow
像MSSQL里的StoredProc就只限制32个Recursion
我个人经验是通过数据库来得到自己要的排列,然后通过LOOP来做出自己要的东西
回复

使用道具 举报

发表于 15-3-2013 04:23 PM | 显示全部楼层
chrizyuen2 发表于 22-3-2011 10:54 PM
1) recursive loop 根本不能做 endless looping 或长周期 looping  
2) 我直接用thread, 没事做,就让t ...

1)  未必。recusrive和iteration是可以对换的。

Endless loop
  1. for(;;) {
  2. // do something
  3. }
复制代码
Recursive loop 和 iteration 都可已设置terminating condition.如过你不terminate,iteration是可以重复一辈子。
回复

使用道具 举报

发表于 15-3-2013 05:57 PM | 显示全部楼层
hongster 发表于 15-3-2013 04:23 PM
1)  未必。recusrive和iteration是可以对换的。

Endless loopRecursive loop 和 iteration 都可已设置 ...


我想把C:\ folder include subfolder内的全部的files名字 放进一个List内。
你写个平常loop给我看看。
  1. static void DirSearch(string sDir)
  2.    {
  3.        try
  4.        {
  5.            foreach (string d in Directory.GetDirectories(sDir))
  6.            {
  7.                foreach (string f in Directory.GetFiles(d))
  8.                {
  9.                    Console.WriteLine(f);
  10.                }
  11.                DirSearch(d);
  12.            }
  13.        }
  14.        catch (System.Exception excpt)
  15.        {
  16.            Console.WriteLine(excpt.Message);
  17.        }
  18.    }
复制代码
本帖最后由 chrizyuen2 于 15-3-2013 06:04 PM 编辑

回复

使用道具 举报

发表于 20-3-2013 10:06 AM | 显示全部楼层
我使用PHP码做示范。我的答案关键在于queue数据结构的使用,我把$dirs当queue使用。
  1. <?php
  2. function dirSearch($dir) {
  3.         $dir = rtrim($dir, '/'); // Optional
  4.         $dirs = array($dir);

  5.         while ($currentDir = array_shift($dirs)) {
  6.                 foreach (scandir($currentDir) as $file) {
  7.                         if (('.' == $file) || ('..' == $file))
  8.                                 continue;

  9.                         $path = $currentDir.'/'.$file;
  10.                         if (is_dir($path)) {
  11.                                 $dirs[] = $path;
  12.                                 continue;
  13.                         }
  14.                         else {
  15.                                 echo $path."\n";
  16.                         }
  17.                 }
  18.         }
  19. }
  20. ?>
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 22-11-2025 05:34 AM , Processed in 0.134483 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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