价值的下降似乎并没有在while循环中起作用

时间:2016-02-29 06:26:12

标签: c while-loop

我一直在努力奋斗几个小时。

我有一个递归函数,详情如下:

void fractal ( turtle_t *t, int x){
  while ( x != 0){
    printf("%d\n", x);
    turtle_walk ( t, 20*x);
    turtle_turn ( t, 25 );
    x -= 2;
    fractal ( t, x );
  }
}

当我运行此代码时,除了x -= 2之外,一切似乎都有效。我以参数x的值10开始。印刷文件给我:

10, 8, 6, 4, 2, 2, 6, 4, 2, 2, etc

我错过了什么吗?

我也尝试过使用

fractal ( t, x-2 );

用于递归调用,但也无法正常工作。

4 个答案:

答案 0 :(得分:3)

您应该在进入和退出函数时添加print语句,以便查看代码的位置。 按编码工作 - 当然,printf()时函数中的x == 0不会被执行。

这是一个简单的代码改编,额外的打印。它忽略了turtle参数和turtle操作。它会在x中记录x0的值,因此可以在退出时打印(也可以在条目上打印,以保持一致性)。

#include <stdio.h>

static
void fractal(/*turtle_t *t,*/ int x)
{
    int x0 = x;
    printf("-->> %d\n", x0);
    while (x != 0)
    {
        printf("%d\n", x);
        /*
        turtle_walk ( t, 20*x);
        turtle_turn ( t, 25 );
        */
        x -= 2;
        fractal(/*t,*/ x);
    }
    printf("<<-- %d\n", x0);
}

int main(void)
{
    fractal(10);
    return 0;
}

这是输出:

-->> 10
10
-->> 8
8
-->> 6
6
-->> 4
4
-->> 2
2
-->> 0
<<-- 0
<<-- 2
2
-->> 0
<<-- 0
<<-- 4
4
-->> 2
2
-->> 0
<<-- 0
<<-- 2
2
-->> 0
<<-- 0
<<-- 6
6
-->> 4
4
-->> 2
2
-->> 0
<<-- 0
<<-- 2
2
-->> 0
<<-- 0
<<-- 4
4
-->> 2
2
-->> 0
<<-- 0
<<-- 2
2
-->> 0
<<-- 0
<<-- 8
8
-->> 6
6
-->> 4
4
-->> 2
2
-->> 0
<<-- 0
<<-- 2
2
-->> 0
<<-- 0
<<-- 4
4
-->> 2
2
-->> 0
<<-- 0
<<-- 2
2
-->> 0
<<-- 0
<<-- 6
6
-->> 4
4
-->> 2
2
-->> 0
<<-- 0
<<-- 2
2
-->> 0
<<-- 0
<<-- 4
4
-->> 2
2
-->> 0
<<-- 0
<<-- 2
2
-->> 0
<<-- 0
<<-- 10

答案 1 :(得分:2)

让我们试着看一下这段代码。

void fractal ( turtle_t *t, int x){
  while ( x != 0){
    printf("%d\n", x);
    turtle_walk ( t, 20*x);
    turtle_turn ( t, 25 );
    x -= 2;
    fractal ( t, x );
  }
}

让我们说这个功能是通过

调用的
fractal(pTurtle, 4);

让我们将其称为第一个堆栈框架,它的外观如下:

x = 4
enter the while loop since 4 != 0
print out 4
ignoring turtle_walk and turtle_turn for now
x is now 2
call the fractal function with pTurtle and 2
remember later we are not done with this function

现在它将创建第二个堆栈帧,看起来像分形的函数调用(pTurtle,2)

x = 2
enter the while loop since 2 != 0
print out 2
ignoring turtle_walk and turtle_turn for now
x is now 0
call the fractal function with pTurtle and 0

它会生成第三个堆栈帧,因此会有一个像

这样的分形调用
fractal(pTurtle, 0)

哪个什么都不做。但我们还没有完成。现在我们回到第二个堆栈框架,也就是调用分形(pTurtle,0)的函数,它现在有一个x = 0.所以它会使条件失败并完成。

现在我们返回到第一个堆栈帧,它仍然具有x = 2.因此它将再次查看并打印2并执行与第二个堆栈帧相同的操作。

因此,您可能从程序中获得的打印输出是:

4
2
2

答案 2 :(得分:1)

  

当我运行这段代码时,一切似乎都工作了x - = 2。

x -=2工作正常,以至于当您输入10时,为什么输入正确printf

看看这个while ( x != 0)。如果x为负,则会导致无限循环。 所以将循环条件更改为while ( x >= 0)

答案 3 :(得分:0)

试试这个

    // 1 -  Test

     UIImageView *sample = [[UIImageView alloc] initWithFrame:CGRectMake(20.0f, 122.0f, 50.0f,50.0f)];
    sample.image = [self getSegmentImageOfRadius:50 andAngleRadians:50];

    [self.view addSubview:sample];

    // Add this funciton to your view controller
    -(UIImage*)getSegmentImageOfRadius:(CGFloat)radius andAngleRadians:(CGFloat)angleRadians{

        UIBezierPath *sector = [UIBezierPath
                                bezierPathWithArcCenter:CGPointMake(0, 0) radius:radius startAngle:0 endAngle:angleRadians clockwise:YES];

        UIGraphicsBeginImageContext(CGSizeMake(radius,radius)); 
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor); // Fill color.
        [sector fill];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); // Create image form curent context.
        UIGraphicsEndImageContext();
        return image;
    }