这个程序的工作规​​则是什么,解释?

时间:2017-09-06 21:55:17

标签: c

我很想在这个程序中混淆,如果有人能向我解释这段代码和输出的功能,我会得到这个程序的输出

1
1
2
2
3
3

我想知道这两个函数的工作规则是如何计算值的?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int M(const int n);
int F(const int n)
{
    return(n==0)?1:n-M(F(n-1));
}
int M(const int n)
{
    return (n==0)?0:n-F(M(n-1));
}

int main()
{
    int i;
    for(i=0;i<6;i++)
    {
        printf("%2d\n",F(i));
    }
    printf("\n");
    return 0;
}

2 个答案:

答案 0 :(得分:0)

考虑for

for(i=0;i<6;i++)
{
    printf("%2d\n",F(i));
}

简答:

F(0) => 1;

F(1)=> 1 - M(F(0))

when  F(0):1 then F(1) = 1 - M(1)
go to calculate M(1), but we start from 0, M(0)= 0;
M(1) = 1- F(M(0)) = 1- F(0) = 1-1=0;
last we have M(1) = 0; and as F(1) = 1-M(1) = 1-0=1
last we have: F(1)=1

更完整:

让我们看看F()的工作方式。 F()中的最后一个命令,   return(n==0)?1:n-M(F(n-1));

扩展到

if (n==0){
 return 1;
}else{
   return n-M(F(n-1));
}

在迭代i:0的第一个中,我们想要F(0),因为n为零,(n:0),if (n==0)为真,return 1;被执行, F(0)的值必须为1.

对于我们需要F(1)的第二次迭代,因为if (n==0)为假,否则阻止执行。

现在是n:1F(1) = 1 - M (F(0))

在上一次迭代中,我们有F(0)=1,现在我们可以重新连接或等式:F(1) = 1 - M(1),很明显,如果我们只有M(1)的值,请将其放在最后一个公式上,F(1)已经解决了。

为此,我们必须扩展M()功能。

同样,我们可以为M()撰写。

if (n==0){
 return 0;
}else{
   return n-F(M(n-1));
}

M(0) = 0;

M(1)= 1- F(M(0))= 1- F(0) = 1 - 1=0;

现在我们将M(1) = 0;放在F(1) = 1 - M(1)上 我们实现了F(1) = 1

现在,您手动计算代码输出中的前两对1

对于其他人,一遍又一遍地这样做。

答案 1 :(得分:0)

正如评论中所建议的那样,尝试手动跟踪代码,我将与您一起完成前两次迭代,以便您了解

当你的程序启动时,它会调用你的main函数,并开始执行for循环,如下所示:

i=0 => calls F(n=0) => is n==0 true? Yes => return 1 => print 1

i=1 => calls F(n=1) => is n==0 true? No => then 1-M(F(0)) => F(0) calculated from the previous iteration to return a value of 1 => call M(n=1) => is n==0 true? No => then 1-F(M(0)) => M(0) returns 0 since n==0 is true => then 1-F(M(0)) is equal to 1-F(0) => we calculated F(0) to return 1 => so 1-F(0) return 0 from M => take the return back to 1-M(F(0)) => 1-0 = 1 => print 1

不要感到沮丧,因为对于某些患者而言,您所询问的内容实际上会更容易理解。我特别建议您按住笔和纸并开始跟踪自己。

  1. 像我一样迭代迭代。
  2. 根据if条件的正确流程调用每个函数。
  3. 当你调用一个函数时,在代码中标记你要跳转到所述函数的位置,这样一旦它返回一个值,你就知道返回值的确切位置。
  4. 纸张和平,耐心和追踪。