好吧,我有很多“ C语言”测试都涉及查找给定函数的输出,此外,我需要精确解释它的目的。其中一些是递归函数。而且,当我遇到递归时,我总是在努力寻找如何示意性地遵循它的方法,即使我成功了,有时我也可能不明白递归函数的目的是什么。
这是两段代码:
主要的
#include <stdio.h>
#include <conio.h>
int f2(int *a, int n, int x);
int main()
{
int a[6] = {4, 3, 4, 2};
printf("%d\n", f2(a, 4, 5));
getch();
}
f2功能:
int f2(int *a, int n, int x)
{
if(n>0 && x!=0){
return (f2(a+1,n-1,x-a[0]) ? 1 : f2(a+1,n-1,x));
}
return (x ? 0 : 1);
}
好吧,该函数的“目的”是检查数组中是否存在一组数字,这些数字的总和将得出x的值。(在此特定示例中为x = 5)。在这种情况下,它将返回true,因为2,3位于数组内部并且2 + 3 = 5。
我的问题是:在纸面上,我如何能示意地遵循它并理解其目的。或者,你们将如何处理此类问题?任何帮助都非常感谢!!
我不会添加出现在我前面的示例。他们本来可以从我自己的演讲材料中获取的。
我想要@Edwin给您的三个部分:这些是您的关键工具。我通常会颠倒前两个。适用于您的特定问题:
终止:只要n为正且x不为0,我们就会继续。当我们通过这些检查中的任何一项时,都会返回x == 0(将返回值解释为false / true)。
返回结果:请注意,此布尔值也是唯一的返回结果。
递归:我们尝试以较小的问题调用函数:
{请注意到目前为止所学的内容:n是一个计数器;x是一个总和,我们得到了最终结果;a是组件列表。}
现在,如果此返回成功(返回true),则将该true传递回调用堆栈(在三元表达式中为1)。如果失败,我们将按照上面的项目符号步骤重试,除非不减少x。然后将此结果传递回该行,无论其值如何。
因此,故障如下所示:
顺便说一句,最后一个通话的中间项应该是n而不是n-1吗?当我们跳过a [0]时,我们并没有用完猜测。
就是说,我真的很怀疑本课程试图教您什么。除非这个问题是一个孤立的例子,否则我不会认为它试图将您变成专业的程序员。该代码未注释,标识符来自打卡日期,返回值是“幻数”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句