Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336623
  • 博文数量: 79
  • 博客积分: 2466
  • 博客等级: 大尉
  • 技术积分: 880
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-07 16:47
文章分类

全部博文(79)

文章存档

2014年(3)

2012年(7)

2011年(14)

2010年(2)

2009年(2)

2008年(2)

2007年(18)

2006年(31)

分类: Java

2014-08-31 21:16:26

Exercise 1.12
Write a procedure that computes elements of Pascal's triangle by means of a recursive
process.


点击(此处)折叠或打开

  1. def elem(n, m) {
  2.     if (m == 1 || m == n) return 1
  3.     else if (m < 1 || m > n) return 0
  4.     else return elem(n-1, m-1) + elem(n-1, m);
  5. }

  6. def line(n) {
  7.     def line_iter;
  8.     line_iter = { total, id ->
  9.         if (id > total) return [];
  10.         else return ([elem(total, id)] + line_iter(total, id+1));
  11.     }
  12.     return line_iter(n, 1);
  13. }

  14. def pascalTriangle(n) {
  15.     def impl = { id ->
  16.         if (id == 0) return "";
  17.         else return "${pascalTriangle(id - 1)}\n${line(id)}"
  18.     }
  19.     return impl(n);
  20. }

  21. println pascalTriangle(7);

------------------result----------------

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]


上面那一版pascalTriangle()写得不好,定义了一个多余的闭包。下面是修改版:

  1. def elem(n, m) {
  2.     if (m == 1 || m == n) return 1
  3.     else if (m < 1 || m > n) return 0
  4.     else return elem(n-1, m-1) + elem(n-1, m);
  5. }

  6. def line(n) {
  7.     def line_iter;
  8.     line_iter = { total, id ->
  9.         if (id > total) return [];
  10.         else return ([elem(total, id)] + line_iter(total, id+1));
  11.     }
  12.     return line_iter(n, 1);
  13. }

  14. def pascalTriangle(n) {
  15.     if (n == 0) return "";
  16.     else return "${pascalTriangle(n - 1)}\n${line(n)}"
  17. }

  18. println pascalTriangle(7);


阅读(442) | 评论(0) | 转发(0) |
0

上一篇:SICP exercise solution in Groovy

下一篇:没有了

给主人留下些什么吧!~~