1

我正在学习递归,在解决正整数 a 除以正整数 b 时的余数计算问题时遇到了概念上的疑问。

我的代码是:

#include<stdio.h>
#include<stdlib.h>
int x;
int rem(int a,int b)
{
    x=a;
    if(x>=b)
    {
        x=x-b;
        rem(x,b);
    }
    printf("%d\n",x);
    return x;
}
int main()
{
    int a,b;
    printf("Enter a & b\n");
    scanf("%d %d",&a,&b);
    int y =rem(a,b);
    printf("rem is :%d",y);
    return 0;
}

它工作正常。我了解到,每次调用都会创建一组新的形式参数和局部变量。

所以我通过在每次递归调用返回时打印 x 来进行实验!但是它正在打印 1 1 1 1。为什么没有打印对应于特定调用的 x 值。?

为什么只打印最后修改的值?..是因为我将“x”声明为全局的吗?

4

4 回答 4

4

在这种情况下,您可能只需要向上移动打印件

int rem(int a,int b)
{
    x=a;
    printf("%d\n",x);
    if(x>=b)
    {
        x=x-b;
        rem(x,b);
    }
    return x;
}

但我认为你应该避免在递归算法中使用全局变量。它可能使算法很难推理。递归函数最好是“纯函数”。

于 2013-06-07T06:55:16.110 回答
2

忽略检查返回值的问题scanf()以及两个输入的值都是正数等,我认为你可以而且应该x完全避免。你可以使用:

#include <stdio.h>

static int rem(int a, int b)
{
    if (a >= b)
        a = rem(a-b, b);
    printf("%d\n", a);
    return a;
}

int main(void)
{
    int a, b;
    printf("Enter a & b\n");
    scanf("%d %d", &a, &b);
    int y = rem(a, b);
    printf("rem(%d, %d) is: %d\n", a, b, y);
    return 0;
}

rem()此代码从每个递归级别捕获返回值。在这种情况下,因为返回的值不会随着递归展开而改变,所以您可以使用全局变量x,但没有必要,您应该尽可能避免使用全局变量。

于 2013-06-07T07:08:26.630 回答
2

这是因为 while x >= b,在被rem()调用之前被重复printf()s调用。只有在每次调用展开时才会调用x < b它们。printf()srem()

您可能希望x本地化以rem()获得所需的结果。

于 2013-06-07T06:59:07.270 回答
0
#include<stdio.h>
#include<conio.h>

int fun(int,int);

int main()
{
    int a,b;
    printf("enter two numbers");
    scanf("%d %d",&a,&b);
    fun(a,b);
    //printf("%d",fun(a,b));

}
int fun(int a,int b)
{

 
   if(a<b)
   printf("%d",a);
   if(a>=b)
   a=fun(a-b,b);
   return a;
}
于 2020-12-02T12:43:12.220 回答