1
1
|
2
3
由于这显然是一个家庭作业问题,我建议你做的协助可能意味着你做。追踪代码。 1) 给出y和z的起始值。 2) 无论是在纸上还是在调试器中,跟踪调用函数时发生的情况。 3) 使用当前y/z值重复步骤2,直到程序完成。 |
3
2
输出:
3和13的工作原理: 偶数和奇数之间有一个开关(参见代码中的注释)。
|
4
1
注意:如果这是家庭作业,请贴上这样的标签。
所以,我们基本上有三个递归的例子。为了更清楚,我将C代码重写为一些函数伪代码。替换
你会想出类似的办法
你现在明白重点了吗? |
5
1
一种方法是将每一行翻译成“英语”。我的翻译是这样的:
如果z为零,则返回零
注意,这里用z/2调用mult,但是它的参数是整数,所以如果函数继续递归,第二个参数每次都会减半,直到它降到1,最后是1/2,取整到0,此时递归将停止,因为z==0。 有了这些线索,您应该能够理解这个算法是如何工作的。 |
6
0
归纳法的论证是基于证明结果对第一个值是有效的,如果原理对一般值是正确的
|
7
0
y 一
b=下一个奇数(即a+1)
y b=y (a+1)=y*a+y 现在把“a”写成2*(z/2)来迷惑所有人。
y*b变成((2*y)*(z/2))+y 因为偶数和奇数的公式中都出现了“z”,我们认为代码告诉我们(2*y)*(z/2)=(2*y)*(z/2)+y,这显然是疯狂的! 原因是我们偷偷地发现z/2是一个整数,所以z不可能是奇数。当z为奇数时,编译器不允许我们将z/2赋给整数。如果我们试图使“z”为奇数,那么我们真正使用的整数是(z-1)/2,而不是z/2。 a或y 在mult(y,z)中,“y”和“z”都是整数。使用mult(2*y,b/2)上面的符号会变成mult(2*y,a/2),因为编译器会将b/2截断为a/2。 b我们用y b/2=a/2+1/2,但1/2不能表示为int的一部分。 |
8
0
不是一个真正的答案,但更多的是一个建议。
有时简化会增加清晰度。另外,添加注释将帮助您了解自己在做什么,以及下一个阅读代码的人。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |