黑马程序员技术交流社区

标题: 新手递归求解答,递归是不是这么写 [打印本页]

作者: 冒牌高手    时间: 2014-8-8 09:53
标题: 新手递归求解答,递归是不是这么写
本帖最后由 冒牌高手 于 2014-8-10 15:30 编辑

编写递归函数求 1+2+3+……+n 的和;

在代码中我也没用到循环,详见代码
  1. class Demo
  2. {
  3.         static int rs=0;
  4.         public static void main(String[] args)
  5.         {
  6.                
  7.                 System.out.println(func(4));
  8.         }
  9.         static int func(int num)
  10.         {
  11.                 if (num>0)
  12.                 {
  13.                         rs+=num;
  14.                         return func(--num);
  15.                 }
  16.                 else
  17.                 {
  18.                         return rs;
  19.                 }
  20.         }
  21. }
复制代码



作者: justin1258    时间: 2014-8-8 10:06
return rs += func(--num)
作者: fantacyleo    时间: 2014-8-8 10:17
本帖最后由 fantacyleo 于 2014-8-8 10:19 编辑

结果正确,形式也正确。不过一般不推荐这么写,因为你这里对外暴露了递归函数中用到的变量rs,破坏了函数的封装性,而一般来说这是可以避免的。比较好的写法是:
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println(func(4));
  6.         }
  7.         static int func(int num)
  8.         {
  9.                 if (num>0)
  10.                 {
  11.                         return num + func(num - 1);
  12.                 }
  13.                 else
  14.                 {
  15.                         return 0;
  16.                 }
  17.         }
  18. }
复制代码


如果你非要用一个变量专门表示和,也可以这样写:
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println(func(4), 0);
  6.         }
  7.         static int func(int num, int sum)
  8.         {
  9.                 if (num>0)
  10.                 {
  11.                         return func(num - 1, sum + num);
  12.                 }
  13.                 else
  14.                 {
  15.                         return sum;
  16.                 }
  17.         }
  18. }
复制代码

作者: 冒牌高手    时间: 2014-8-8 10:47
fantacyleo 发表于 2014-8-8 10:17
结果正确,形式也正确。不过一般不推荐这么写,因为你这里对外暴露了递归函数中用到的变量rs,破坏了函数的 ...

那是我自己想着写的....果然不正确,哈哈,有了那个变量,运行第二次的时候结果就不对了....所以还是你的写法是对的...我那个不对
作者: 冒牌高手    时间: 2014-8-8 12:13
beyondjia 发表于 2014-8-8 11:15
正确的。不过总觉得1到100求和的问题上,递归的优势和形式不明显。。。阶乘和汉诺塔可以试着写写。。。 ...

不懂汉诺塔...百度去了,哈哈




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2