我正在学习递归,当正整数除以正整数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'声明为全局吗?
答案 0 :(得分:4)
在这种情况下,您可能只需要移动打印件
int rem(int a,int b)
{
x=a;
printf("%d\n",x);
if(x>=b)
{
x=x-b;
rem(x,b);
}
return x;
}
但我认为你应该避免在递归算法中使用全局变量。它可能使算法很难推理。递归函数最好是“纯函数”。
答案 1 :(得分:2)
这是因为在调用x >= b
之前重复调用rem()
,printf()s
。只有在x < b
之后,printf()s
才会在rem()
上的每次调用都会被调用。
您可能希望将x
设为rem()
本地,以获得所需的结果。
答案 2 :(得分: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
,但不需要它,你应该尽可能地避免使用全局变量。
答案 3 :(得分: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;
}