黑马程序员技术交流社区
标题:
递归原理求解
[打印本页]
作者:
FFF
时间:
2013-10-19 11:43
标题:
递归原理求解
本帖最后由 FFF 于 2013-10-19 13:38 编辑
public class Temp10_19
{
public static void main (String[] args)
{
System.out.println("用循环实现求 n! 的结果(n=4):"+f1(5));
System.out.println("用递归实现求 n! 的结果(n=4):"+f2(5));
}
static long f1(int n)
{
long k=1;
for(int i=1;i<=n;i++)
k*=i;
return k;
}
static long f2(int n)
{
if(n==1) return 1;
else return n*f2(n-1);//这句不明白,请给我详细讲解一下!谢谢
}
}
复制代码
后一句里的递归不太理解,请对递归理解比较深的同学给我注解注解。谢谢!
作者:
上篮高手
时间:
2013-10-19 12:20
我总结的递归三个条件是:
1.具有返回值,且返回类型跟参数类型相容.
2.具有结束条件.
3.自身调用.
我觉得递归就是,不断地自身调用自身,但是不能没完没了,那样就成了死循环了,就是必须有结束条件,让它跳出循环。(一般来说跳出循环的体就是直接return一个返回值)
你需要一个可以找到规律的循环条件,并且在循环体里要做的同一件事情,这时候可以用递归来实现,这是我的想法
本例中: 你的if(n==1) return 1; 是结束条件,因为f 函数传入的参数一直在减小,所以达到n = 1时 递归就结束了,这时的运算结果就是n 的 阶乘
作者:
卜弦
时间:
2013-10-19 12:24
public class Temp10_19
{
public static void main (String[] args)
{
System.out.println("用循环实现求 n! 的结果(n=4):"+f1(5));
System.out.println("用递归实现求 n! 的结果(n=4):"+f2(5));
}
static long f1(int n)
{
long k=1;
for(int i=1;i<=n;i++)
k*=i;
return k;
}
static long f2(int n)
{
if(n==1) return 1;
else return n*f2(n-1);//这句不明白,请给我详细讲解一下!谢谢
}
}
/*
这句话的意思是说将n-1作为参数传给f2.具体点说就是:
当调用f2(5)时,第一次n=5,运行到
if(n==1) return 1;//判断不满足,继续执行
else return n*f2(n-1);//返回的是5*f(n-1)
n-1=4;注意此时是将4传给f2,也就是说这时n=4;
这里的n-1和n之间一定要区分开:
n是f2的形式参数,只是一个代号,这里的n-1是一个具体的值。
然后再调用函数f2执行上面两句话,此时返回的是5*4*f2(n-1)
*/
复制代码
作者:
周学彬
时间:
2013-10-19 13:23
根据递归的原理,你画一个简单的流程图就可以明白递归的原理了。
计算f2(5)来举例:
第一步:f2(5) = 5 * f2(4)
第二步: = 5 * 4 * f2(3)
第三部: = 5 * 4 * 3 * f2(2)
第四步: = 5 * 4 * 3 * 2 * f2(1)
第五步: = 5 * 4 * 3 * 2 * 1 //因为调用到f2(1)时,不需要再递归了,直接就返回了1
然后计算出结果就对了。
作者:
FFF
时间:
2013-10-19 13:38
很感谢各位,回答得真好!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2