java for循环改递归,如何将此循环转换为递归?

回答(5)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这是给你的一段代码 . 使用对称填充 .

public class Hourglass {

public static void printRow(int nStars, int padding) {

if (nStars == 0)

return;

if (padding > 0) {

System.out.print(" ");

printRow(nStars, padding - 1);

System.out.print(" ");

return;

}

if (nStars <= 0)

return;

System.out.print("*");

if (nStars > 1) {

System.out.print(" ");

printRow(nStars - 1, padding);

}

}

public static void printTop (int height, int padding) {

if (height == 0)

return;

printRow(height,padding);

System.out.print("\n");

printTop(height - 1, padding + 1);

}

public static void printBottom(int currentHeight, int height, int padding) {

printRow(currentHeight, padding);

System.out.print("\n");

if (currentHeight < height)

printBottom(currentHeight + 1, height, padding - 1);

}

public static void printHourglass(int height) {

if (height <= 0)

throw new IllegalArgumentException();

printTop(height, 0);

printBottom(1, height, height - 1);

}

public static void main(String[] args) {

printHourglass(5);

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

而不是循环你的程序,你调用相同的功能 .

public static void hourglass(int numberOfStars, int numberOfSpaces){

hourglass(numberOfStars, numberOfSpaces, false);

}

private static void hourglass(int numberOfStars, int numberOfSpaces, boolean dir){

if(dir==false && numberOfStars > 0){

printMany(numberOfSpaces, " ");

printMany(numberOfStars, "X ");

System.out.println();

hourglass(--numberOfStars, ++numberOfSpaces, false);

return;

}

if(numberOfStars==0){

numberOfSpaces -=2;

numberOfStars += 2;

}

if(numberOfSpaces>0){

printMany(numberOfSpaces, " ");

printMany(numberOfStars, "X ");

System.out.println();

hourglass(++numberOfStars, --numberOfSpaces, true);

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

只需将该方法拆分为两个,这是您的问题的另一个递归解决方案:

public static void hourglass(int numberOfStars, int numberOfSpaces) {

if(numberOfStars== 0) return;

printMany(numberOfSpaces++, " ");

printMany(numberOfStars--, "X ");

System.out.println();

hourglass(numberOfStars,numberOfSpaces);

numberOfSpaces -=2;

numberOfStars += 2;

if(numberOfStars==2)

hourglassBottom(numberOfStars,numberOfSpaces);

}

public static void hourglassBottom(int numberOfStars, int numberOfSpaces){

if(numberOfSpaces==0 )return;

printMany(numberOfSpaces--, " ");

printMany(numberOfStars++, "X ");

System.out.println();

hourglassBottom(numberOfStars,numberOfSpaces);

}

例如,运行沙漏(3,1);会给你以下:

X X X

X X

X

X X

X X X

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这是一种可能的解决方案:

public static void printMany(int count, String s) {

if (count == 0)

return;

System.out.print(s);

printMany(count - 1, s);

}

public static void upperhalf(int count, int max) {

if (count == 0)

return;

printMany(max - count, " ");

printMany(count, "* ");

System.out.println();

upperhalf(count - 1, max);

}

public static void lowerhalf(int count, int max) {

if (count == max)

return;

printMany(max - count - 1, " ");

printMany(count + 1, "* ");

System.out.println();

lowerhalf(count + 1, max);

}

public static void hourglass(int n) {

upperhalf(n, n);

lowerhalf(0, n);

}

在例如中调用 hourglass(1); main 结果:

*

*

所以 hourglass(2); 打印:

* *

*

*

* *

等等...

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我不只是给你答案,但我会尽力帮助你 . 如果你想使用递归和没有循环来解决这个问题,那么关键在于弄清楚递归辅助函数的参数必须是什么 . 看起来你总是需要记住原始用户输入(知道要打印多少空格并知道何时停止递归),你当前的星数,以及你是否在顶部金字塔的一半或下半部分 . 鉴于所有这些信息,您应该能够做两件事 . 首先,您应该能够正确地打印出一条线 . 其次,您应该能够确定下一行应该是什么 . 鉴于此,您可以打印并递归,一旦达到基本案例就停止 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值