我正在准备计算机科学AP考试,并将递归作为主题之一。作为编程的新手我想知道是否有任何简单的方法,或者你想提供一些关于递归的技巧。在考试中,我们无法访问计算机(显然)。那么找到递归解决方案的简单方法是什么。例如,以下是我书中的一个问题。
public static int mystrey(int x)
{
if(x == 0)
{
return 0;
}
else
{
return (x + mystrey(x/10)+mystrey(x/4);
}
}
如果调用mystrey(10),返回值是多少?
答案 0 :(得分:3)
如果您使用递归,那么了解函数的含义是很好的。这有助于理解为什么该方法是递归的。此外,计算纸上的功能主要通过称为“调度”的方法来完成。在这种情况下,您会看到mystrey(0) = 0
(if-case)。
如果你想计算mystrey(10)的值,你知道它是10,mystrey(1)和mystrey(2)之和。
您只需创建一个可放置的表:
0: 0
10: 10+f(1)+f(2)
我们现在计算具有最高参数的函数的值,所以mystrey(2):
2: 2+f(0)+f(0)
我们知道f(0)的值,它已经在表中,所以
2: 2+0+0=2
现在我们计算f(1)=1
我们最后得出结论f(10)=10+f(1)+f(2)=10+1+2=13
。
当有大量递归时,使用表会变得有用。很多时候递归导致重叠,其中必须计算具有相同参数的函数的次数很多。通过调度可以避免“分支”。人们可以看到树的递归。因为f(0)
具有固定值,所以这称为“基本情况”并且是树的叶子。其他函数值称为“分支”。在计算f(10)
时,我们需要计算f(1)
和f(2)
,因此可以从f(10)
到f(2)
和f(1)
绘制边。所以人们可以重复这个过程。
同样在大多数情况下,优秀的程序员会在算法中对此调度进行编程。这当然是通过在数组中声明一个存储值的数组并对其执行查找来完成的。
在递归理论中,递归由两部分组成:一个基本案例部分,其中答案是针对某些函数调用的“硬编码”(在您的示例中为x=0
时),以及递归部分f(x)
1}}写在f(y)
的部分内容中。通常,可以通过构建具有硬编码值的初始表来使用调度,并通过开始在表中填写x
的条目来计算特定x
的值,然后进行计算。
答案 1 :(得分:2)
mystrey(10)
执行方法正文,直到return (10 +
,然后递归调用mystrey(10/10)
。这意味着,x + mystrey(x/10)
的计算必须等到mystrey(10/10)
返回结果。
因此,计算mystrey(1)
,并以相同的方式返回(1 + mystrey(0) + myStrey(0))
,等于1.现在我们在初始外部方法调用中有10 + 1 + mystrey(10/4)
。
我猜你现在有足够的信息来完成剩下的工作。
答案 2 :(得分:2)
递归是一种痛苦手动展开。基本上,您使用其输出替换每个递归调用:
mystrey(10)
= 10 + mystrey(10/10) + mystrey(10/4)
= 10 + (1 + mystrey(1/10) + mystrey(1/4)) + (5/2 + mystrey(5/20) + mystrey(5/8))
= ...
由于您将变量声明为int
个类型,因此小于1
的所有内容都会映射到0
。如果if (x == 0)
,您的0
案例会返回x == 0
,因此您可以得出结论:
mystrey(10)
= 10 + (1 + mystrey(1/10) + mystrey(1/4)) + (5/2 + mystrey(5/20) + mystrey(5/8))
= 10 + (1 + mystrey(0) + mystrey(0)) + (5/2 + mystrey(0) + mystrey(0))
= 10 + (1 + 0 + 0) + (5/2 + 0 + 0)
= 11 + 5/2
5/2
评估为2
,因此您的最终答案为13
(我通过在Python中运行您的代码进行检查)。