我一直在努力奋斗几个小时。
我有一个递归函数,详情如下:
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 );
用于递归调用,但也无法正常工作。
答案 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;
}