
java递归求数字10的阶乘。
publicstaticintadd(inti){if(i==1)return1;elsereturnadd(i=1)*i}现在i是10,进入到代码中的else这时候ad...
public static int add(int i){
if(i==1)return 1;
else return add(i=1)*i
}
现在i是10,进入到代码中的else 这时候add(i-1)就是多少呢?是9吗?为什么?9乘以i就是乘以10等于90,
怎么一递归,又是90乘以8了呢? 如果按照我的分析。应该又是8乘以i就是乘以9等于72.里面的逻辑感觉好复制。有没有高手通过一种方式让我真正理解这个计算的过程。不然我一晚上睡不着。
非常非常感谢。要是用通俗的语言让我理解了计算过我在加30分的奖励分。
都回答的非常好我不知道选谁为答案了。。。。。。咋办啊。。。。。 展开
if(i==1)return 1;
else return add(i=1)*i
}
现在i是10,进入到代码中的else 这时候add(i-1)就是多少呢?是9吗?为什么?9乘以i就是乘以10等于90,
怎么一递归,又是90乘以8了呢? 如果按照我的分析。应该又是8乘以i就是乘以9等于72.里面的逻辑感觉好复制。有没有高手通过一种方式让我真正理解这个计算的过程。不然我一晚上睡不着。
非常非常感谢。要是用通俗的语言让我理解了计算过我在加30分的奖励分。
都回答的非常好我不知道选谁为答案了。。。。。。咋办啊。。。。。 展开
展开全部
我按照我的理解给你解答一下,希望你能看明白。
我理解中的递归,就是在没完成当前运算的情况下,先完成当前运算的上一级,如上一级仍未完成则继续推向上一级,知道完成某一级运算后,在逐条往回返,最终的运算结果就是最终的值。
i 为 10时,add(10) = 10*(add(9)),此时10为整数,而我们需要计算出add(9)为多少;
i 为 9 时,add(9) = 9*(add(8)),这样再结合上一级 add(10) = 10*9*(add(8))
...
i 为2时, add(2) = 2*(add(1))=2*1,因此add(10) = 10*9*8*7*6*5*4*3*2*1.
我理解中的递归,就是在没完成当前运算的情况下,先完成当前运算的上一级,如上一级仍未完成则继续推向上一级,知道完成某一级运算后,在逐条往回返,最终的运算结果就是最终的值。
i 为 10时,add(10) = 10*(add(9)),此时10为整数,而我们需要计算出add(9)为多少;
i 为 9 时,add(9) = 9*(add(8)),这样再结合上一级 add(10) = 10*9*(add(8))
...
i 为2时, add(2) = 2*(add(1))=2*1,因此add(10) = 10*9*8*7*6*5*4*3*2*1.
追问
关键是这个代码为什么会把之前返回的数也乘上??比如最开始是add(9)*10,递归后是add(8)*9为什么默认就乘以10???这是我想不通的缘故。有没有简介通俗的语句和我解释下呢?
追答
因为你调用的方法是 add(10),那么add(10)的返回值就是10*某一个值,这个某一个值也是一个方法,需要计算后才能知道准确值,那么计算得来的值还是要与10相乘才能构成add(10)的返回值。
换个角度来看:该方法写的目的就是递归来计算某一个数的的阶乘,阶乘就是当前数依次乘以比它小一位的整数直到乘以1为止。所以方法就会按照这个目的来写。
int x = 1; // 1为初始值,由于与任何值相乘不影响结果。
for(int i=10;i>0;i--){
x = i * x
}
以上的代码也是来计算10的阶乘。其实和递归的道理一样,x作为一个记录中间结果的载体,与上面所说的某一个值所代表的意思是一样的。
展开全部
public class DiGui {
public static void main(String[] args) {
DiGui d = new DiGui();
System.out.print(d.TT(10));
}
public double TT(int i)//写一个返回值为double 类型的方法,10的阶层值比较大int类型的值无法表示
{ //方法体比较简单
if(i <= 1)
{
return i;
}
else
{
return i*TT(i-1);
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
i=10 进入 代码中的else 这时候add(i-1)变成 add(9)*10 不是具体值 还在递归中。
add(9)又进入循环变成add(8)*9 所以到
8的时候 返回的是add(8)*9*10 之后 继续直到 add(1)*2*3*4*5*6*7*8*9 *10,由于add(1)=1
所以最终 为 1*2.....*10;
add(9)又进入循环变成add(8)*9 所以到
8的时候 返回的是add(8)*9*10 之后 继续直到 add(1)*2*3*4*5*6*7*8*9 *10,由于add(1)=1
所以最终 为 1*2.....*10;
追问
关键是这个代码为什么会把之前返回的数也乘上??比如最开始是add(9)*10,递归后是add(8)*9为什么默认就乘以10???这是我想不通的缘故。有没有简介通俗的语句和我解释下呢?
追答
他有个return啊 每次返回 return add(i-1)*i return 返回的不仅仅是add(i-1),他返回的值还要乘以i啊
开始的时候i=10啊 所以会renturn add(9)*10 ;第二次 i=9进去的啊 所以 add(9)=add(8)*9;带入到第一次 就变成 return add(8)*9 *10
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
递归的程序,代码很短,就是要想好流程,实在看不懂,就用真实的数据来一行行的走.注意结束的条件
add(10)
=add(9) * 10
=add(8) * 9 * 10
=add(7) * 8 * 9 * 10
=add(6) * 7 * 8 * 9 * 10
=add(5) * 6 * 7 * 8 * 9 * 10
=add(4) * 5 * 6 * 7 * 8 * 9 * 10
=add(3) * 4 * 5 * 6 * 7 * 8 * 9 * 10
=add(2) * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10
=add(1) * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10
根据条件,i==1的时候,返回1.所以,结束了,即:
1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 = 3628800
add(10)
=add(9) * 10
=add(8) * 9 * 10
=add(7) * 8 * 9 * 10
=add(6) * 7 * 8 * 9 * 10
=add(5) * 6 * 7 * 8 * 9 * 10
=add(4) * 5 * 6 * 7 * 8 * 9 * 10
=add(3) * 4 * 5 * 6 * 7 * 8 * 9 * 10
=add(2) * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10
=add(1) * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10
根据条件,i==1的时候,返回1.所以,结束了,即:
1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 = 3628800
追问
关键是这个代码为什么会把之前返回的数也乘上??比如最开始是add(9)*10,递归后是add(8)*9为什么默认就乘以10???这是我想不通的缘故。有没有简介通俗的语句和我解释下呢?
追答
我这样说你还不能理解,那你还是去看看书吧,看看递归是怎么回事。。。。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
add(10)时,返回 add(9) * 10 ,继续调用add(9)的方法,然后一路到底
add(9)时,返回 add(8)* 9
。。。。。。。。。。。。。
add(3),返回 add(2)*3
add(2),返回 add(1)*2
add(1),返回 1
最后就是10*9*8*---*3*2*1
add(9)时,返回 add(8)* 9
。。。。。。。。。。。。。
add(3),返回 add(2)*3
add(2),返回 add(1)*2
add(1),返回 1
最后就是10*9*8*---*3*2*1
追问
关键是这个代码为什么会把之前返回的数也乘上??比如最开始是add(9)*10,递归后是add(8)*9为什么默认就乘以10???这是我想不通的缘故。有没有简介通俗的语句和我解释下呢?
追答
呵呵,add(10),返回的是啥???
另外一个就是基本数据是按值传递的。和i没啥关系
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |