有人可以帮助我吗,我真的不明白他们到底是如何在这个程序中得到 x*y ...问题询问程序是做什么的?
PROGRAM iz52(output);
VAR pom: integer;
FUNCTION calc(x,y: integer): integer;
BEGIN
IF (y=1) THEN
calc:= x
ELSE
calc:= calc(x, y-1) + x
END;
A) x+y
B) x*y
C) x^y
您可以通过重写源代码来解决您的任务。 您应该从
取货 if y = 1 then
calc ≔ x
else
calc ≔ calc(x, y − 1) + x
无论
x
的值如何,y
都是结果的一部分。
在一种情况下,它只是 x
,在另一种情况下,我们在 x
中添加“某些东西”。
因此,您可以将源代码承包到
calc ≔ x
if y ≠ 1 then
calc ≔ calc(x, y − 1) + x
不改变
calc
的最终结果。
请注意,当我们交换 y = 1
和 y ≠ 1
分支的含义时,else
更改为 then
。
此外,由于
y ≠ 1
是一个 Boolean
表达式,我们可以使用 integer
函数将值转换为 ord
。
请记住,如果任何因子为零,则乘积为零。
因此整个函数定义可以归结为:
calc ≔ ord(y ≠ 1) × calc(x, y − 1) + x
我们可以用简洁的定义来扩展
calc(x, y − 1)
。
为此,我们将每次出现的 y
替换为参数值 (y − 1)
,而 x
保持不变:
calc ≔ ord(y ≠ 1) × (ord((y − 1) ≠ 1) × calc(x, (y − 1) − 1) + x) + x
现在使用常规算术来简化它:
calc ≔ ord(y ≠ 1) × (ord(y ≠ 2) × calc(x, y − 2) + x) + x
再次展开它,这次
y
成为嵌套 (y − 2)
内的 calc
:
calc ≔ ord(y ≠ 1) × (ord(y ≠ 2) × (ord((y − 2) ≠ 1) × calc(x, (y − 2) − 1) + x) + x) + x
并重新简化:
calc ≔ ord(y ≠ 1) × (ord(y ≠ 2) × (ord(y ≠ 3) × calc(x, y − 3) + x) + x) + x
这应该足以开始看到一种模式: 对于每个
y
,我们在末尾添加另一个 + x
。
考虑到原始源代码,如果从 1
连续减去 y
得到 1
(或者从一开始就已经是 1
),则该模式停止。
现在,假设
y
是 integer
i。 e.范围为 −maxInt
到 +maxInt
的值,不能保证连续减法最终会产生 1
;所以我们需要区分两种情况:
y
≥ 1
,因此可以达到中止条件 y = 1
(基本情况):
y
为 1
,则立即应用基本情况,最终结果为 x
。y
为 2
,则在一个递归步骤后应用基本情况,最终结果为 x + x
。y
是3
,则最终结果是x + x + x
,以此类推。像这样写出内容时,很明显,在最后一种情况下,
3
是总和中的项数(x
出现了三次)。
y
是 < 1
因此永远无法达到基本情况:
最终参数 y
变为 −maxInt
,因此尝试操作 −maxInt − 1
会导致错误,因为在不违反减法数学性质的情况下无法计算它。
总结
y
≥ 1
calc(x, y)
计算 x × y
,并且 y
< 1
calc(x, y)
实际上是 未定义(请记住,函数的共域是 ℤ,即 integer
的集合,因此不要说它是 ∞)。因此没有一个答案选项是正确的。