Java开发

细节是一个工程师的基本素养

Haskell之美——求子集问题

要求数列[1,2,3]子集,结果应该如下(顺序无关):
[[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]

如果用C语言求解,在CSDN上找到别人的代码如下
 1   #define   N   4  
 2   #include   <stdio.h>  
 3   int   used[N]={0};//加上  
 4    
 5   void   output()  
 6   {  
 7         int   i;  
 8         for(i=0;i<N;i++)if(used[i])printf("%d   ",i+1);  
 9         printf("\n");  
10   }  
11    
12   void   f(int   i)  
13   {  
14         if(i>=N)  
15         {  
16               output();  
17               return;  
18         }  
19         f(i+1);  
20         used[i]=1;  
21         f(i+1);  
22         used[i]=0;//加上  
23   }  
24    
25   void   main()  
26   {  
27       f(0);  
28       getchar();  
29   }    

如果是Haskell呢?(不包括空集)
1 subsets :: [a] -> [[a]]
2 subsets [x]  = [[x]]
3 subsets (x:xs)  = [x] :  [x:i|i<-s]++ s
4   where s = subsets xs

除去声明就三行还可以缩减到2行。且含义清楚。Haskell果然是一个研究算法最好的语言。



posted on 2008-12-15 22:25 躺着读书 阅读(683) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

My Links

Blog Stats

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜