我不明白这是如何运作的。我知道基本的事实递归,但这是一种混合型。有人可以根据这个确切的代码片段逐步解释输出结果吗?即使只是一些第一个值(在代码末尾注释)?
public class recursion1st
{
public static String recFun(int x)
{
if (x <= 0) return "/";
return recFun(x-3) + x + recFun(x-2) + x;
}
public static void main(String[] args)
{
System.out.println(recFun(8));
}
}
//Produces '/2/25/3/1/1358/3/1/136/1/14/2/2468 '(?)
答案 0 :(得分:0)
在main函数中,它调用 recFun()来打印数据。在该函数中,它是递归的,第一个 if 条件是在满足该条件时(当x为负或等于零时)突破递归。 否则它将返回一个字符串,反过来再次调用自己。
这里,在第一次返回时,它调用recFun(5)和recFun(6),同样,如果逐步分析,循环将继续,直到满足中断条件。返回语句基本上是字符串的连接,它通过在突发递归时放置“/”来分隔数据。
修改强> return语句返回的值是
rec(5)+8+rec(6)+8......(1)
,其中
rec(5) returns rec(2)+5+rec(3)+5......(2)
和
rec(6) returns rec(3)+6+rec(4)+6.......(3)
其中
rec(3) returns "/"+3+rec(1)+3.......(4)
和
rec(4) returns rec(1)+4+rec(2)+4.....(5)
和
rec(2) returns "/" +2 +"/"+2.....(6)
和
rec(1) returns "/"+1+"/"+1 .......(7)
(5)中的替代(7)和(6)
(4)中的替代(7)
(3)中的替代(4)和(5)
(2)中的替代(4)和(6)
并替换(1)中的(2)和(3)
您需要一张表格。尝试使用它来解决它。希望能帮助到你。 :)
答案 1 :(得分:0)
3 |函数采用int参数
5 |这是你的基本情况,返回&#34; /&#34;如果...
6 |这是你的递归,调用recFun(x-3)+ x / *这是你当前的值* / recFun(x-2)+ x。基本上这将会发生,直到你的x达到0或更低。请注意,正确的根递归调用将在它到达基本情况之前经历更多递归,因为它每次都传递x - 2而不是x-3。还要实现这个语句递归调用两次。
在一张大纸上制作一张图表并绘制出8英寸的地图:
8
根 return recFun(5)+ 8 + recFun(6)+ 8
第一个分支 return recFun(2)+ 5 + recFun(3)+ 8 第二个分支 return recFun(3)+ 6 + recFun(4)+ 6 ....................... 继续前进将变得清晰。答案 2 :(得分:0)
拿一篇论文逐步写下函数的作用:
recFun(5)
|
recFun(2) + 5 + recFun(3)+5
| |
recFun(-1)+2+recFun(0)+2 recFun(0)+3+recFun(1)+3
| | | |
"/" "/" "/" recFun(-2)+1+recFun(-1)+1
| |
"/" "/"
1 使用5
调用recFun2 5导致recFun与2&amp; recFun with 3
3 2导致recFun与-1&amp; recFun为0,3导致recFun为0&amp; recFun with 1
4 -1导致“/”,0导致“/”,0导致“/”,1导致recFun与-2&amp; recFun(-1)
5 -2导致“/”,-1导致“/”
直到每个单一调用都完成执行(直到x <= 0并且返回“/”)之前没有进行任何调用将返回任何内容。该函数开始从该调用链的末尾返回字符串(在此金字塔中:从下到上和从右到左)
/ 1 / 1
/ 2 / 2 / 3 3
5 5
-> / 2 / 2 5 / 3 / 1 / 1 3 5
我知道,递归令人困惑。唯一可以帮助我的是:首先进行递归函数的每次最后一次调用,并且只有当最后一次调用返回任何内容然后回滚时。对不起,如果这不是更精确:)