0
  static void print(int i){
        if( i > 1){
            System.out.print("Y");
           print(i-1);
        }
        for(int t = 0; t < i ; t++){
            System.out.print(i);
        }
    }

此代码具有以下输出;YY122333 带打印(3);

但是,我不明白为什么。为什么函数会以打印 1 开头?它不会先通过 if 函数,然后打印一个 Y,然后打印一个实心 2?

4

6 回答 6

2

这是你的顺序:

i = 3, call print(3-1)

    i = 2, call print(2-1)

        i = 1, don't call print as 1 > 1 == False
        for (int t=0; t<1; t++) prints '1'

    for (int t=0; t<2; t++) prints '2' two times

for (int t=0; t<3; t++) prints '3' three times

当代码看起来很奇怪时,在像 Eclipse 这样的 IDE 中使用调试器单步调试它并观察变量的变化总是很有帮助的。

于 2013-09-24T08:42:38.293 回答
2

你的算法是递归的。如果你在你的陈述中遵循这个逻辑

static void print(int i){
    if( i > 1){
        System.out.print("Y");
       print(i-1);
    }
    for(int t = 0; t < i ; t++){
        System.out.print(i);
    }
}

Call print(i==3)
i > 1 -> TRUE
Prints Y
Call print (i==2)
    i > 1 -> TRUE
    Prints Y
    Call print (i==1)
        i > 1 -> FALSE
        t = 0, t < 1 -> true
        print 0
        t = 1, t < 1 -> false
        return 
    t = 0, t < 2 -> true
    print 0
    t = 1, t < 2 -> true
    print 1
    t = 2, t < 2 -> false
    return
t = 0, t < 3 ->
and so on. 

希望这可以帮助

于 2013-09-24T08:43:26.717 回答
1

您制作了一种称为递归函数的特殊类型的函数,这意味着该函数会调用自身。

所以你第一次调用它(参数大于1,我猜你的情况是3),它打印Y然后它print再次调用函数作为参数i-1 (2)

因此,它再次进入函数,评估条件,并且 asi>1再次使用1as 参数调用自身。

它再次进入内部,但这次不同,第一个条件为假,它跳转到 for 循环中打印1一次。

然后函数被恢复,调用函数将被带回我们离开它的地方(你记得,它是同一个函数,参数为 2)。所以它进入循环,打印2两次并恢复......

... 以 3 作为参数的函数的第一次调用。所以它进入循环并打印3三遍。

然后执行恢复到print首先调用该函数的任何函数

于 2013-09-24T08:45:51.557 回答
0

不,代码有一个递归调用。函数在函数体中调用自身:print(i-1)

于 2013-09-24T08:38:12.853 回答
0

不,它不会。这叫做递归。当它找到一个参数i > 1时,它会调用自己,等待该方法完成(打印其他所有内容)然后继续。

于 2013-09-24T08:39:08.977 回答
0
Iteration   Step                        info                Output

1           enter print function        i==3
1           if (i>1)                    3 > 1 == true
1           System.out.print("Y")                           Y
1           call print functin with i-1 i - 1 == 2
2           enter print function        i==2
2           if (i>2)                    2 > 1 == true
2           System.out.print("Y")                           YY
2           call print function with i-1    i - 1 == 1
3           enter print function        i==1
3           if (i>1)                    1 > 1 == false
3           for (t=0; t<i; t++)         t==0; 0 < 1 == true
3           System.out.print(i)                             YY1
3           for (t=0; t<i; t++)         t==1; 1 < 1 == false
3           end iteration
2           for (t=0; t<i; t++)         t==0; 0 < 2 == true
2           System.out.print(i)                             YY12
2           for (t=0; t<i; t++)         t==1; 1 < 2 == true 
2           System.out.print(i)                             YY122
2           for (t=0; t<i; t++)         t==2; 2 < 2 == false
2           end iteration   
1           for (t=0; t<i; t++)         t==0; 0 < 3 == true
1           System.out.print(i)                             YY1223
1           for (t=0; t<i; t++)         t==1; 1<3 == true
1           System.out.print(i)                             YY12233
1           for (t=0; t<i; t++)         t==2; 2<3 == true
1           System.out.print(i)                             YY122333
1           for (t=0; t<i; t++)         t==3; 3<3 == false
1           end iteration
于 2013-09-24T08:57:57.387 回答