Pascal考试程序,不懂

问题描述 投票:0回答:1

This is the problem

有人可以帮助我吗,我真的不明白他们到底是如何在这个程序中得到 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
pascal freepascal turbo-pascal
1个回答
0
投票

您可以通过重写源代码来解决您的任务。 您应该从

取货
            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
    的集合,因此不要说它是 ∞)。

因此没有一个答案选项是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.