Java 如何将这个简单的for循环转换为递归
试试这个Java 如何将这个简单的for循环转换为递归,java,for-loop,recursion,Java,For Loop,Recursion,试试这个 "sip of a coffee". a包; 导入java.util.Scanner; 用于LoopToRecursion的公共类{ 公共静态void main(字符串[]args){ 扫描仪输入=新扫描仪(System.in); System.out.println(“输入SIP数量”); int sip=input.nextInt(); 如果(sip>=10){ int n=sip; 递归(n); /*对于(int i=0;i
"sip of a coffee".
a包;
导入java.util.Scanner;
用于LoopToRecursion的公共类{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
System.out.println(“输入SIP数量”);
int sip=input.nextInt();
如果(sip>=10){
int n=sip;
递归(n);
/*对于(int i=0;i@Dima Maligin绝对正确。这是一个解释递归核心概念的基本示例。理解这一点将有助于理解更复杂的递归算法
对@Franscisco Hernandez给出的答案进行一点扩展:
递归的核心概念是将问题简化为同一问题的较小实例,并根据部分结果构造结果。
用编程术语来说:您编写一个函数,通过调用自身来解决问题
这需要两个特定的部分(大致来自):
可以停止递归的基本情况。我也听到过这方面的术语“地板”或“锚”。这必须是一个原子版本的问题,你可以很容易地解决
一组规则,允许您将问题简化为重复步骤
让我们将此应用于您的示例。你有一杯咖啡,里面至少有10小口咖啡。你必须全部啜饮(此处没有口袋妖怪参考)。因此,如果没有更多的啜饮,你可以停止。这是基本情况。在到达那个点之前,我们一口一口地喝咖啡。在循环中,每个sip都是在循环的一次迭代中完成的。这里我们使用递归规则来实现这一点。还剩下一小口吗?喝一口,继续少喝一口。在某个时刻(特别是在用户通过扫描仪输入的数字之后),您将用完SIP并进入基本情况
在Java代码中,如下所示:
package a;
import java.util.Scanner;
public class ForloopToRecursion {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Enter number of sips");
int sip = input.nextInt();
if (sip >= 10) {
int n = sip;
recursion(n);
/*for (int i = 0; i < sip; i++) {
System.out.println("sip of a coffee" + n);
n--;
}*/
}
}
private static void recursion(int sip) {
if (sip == 0) {
return;
}
System.out.println("sip of a coffee" + sip);
recursion(sip-1);
}
}
我希望这有帮助。记住,这是一个典型的编程101任务,更多涉及递归的任务即将到来。在你接触到像“快速排序”这样的新奇事物之前,你想了解这一点。玩得开心:)为什么?在这个例子中使用递归是没有意义的(和循环相比也是低效的)。。。所有想成为一名“有价值的程序员”的人都不必知道。需要的时候会到来,“这些”练习的目的不是效率,而是理解概念。这就是你的老师想要给你的。所以,在你们大喊“迭代更好”和“难怪他是老师”之前,请记住上面所说的。我知道老师正在做需要做的事情@阿努达尔·沙特(AnoudAl Saud(+1)虽然我不认为OP值得这么做,但问题是“为我做吧”。我倾向于不把时间花在提问者没有花时间思考的问题上。
package a;
import java.util.Scanner;
public class ForloopToRecursion {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Enter number of sips");
int sip = input.nextInt();
if (sip >= 10) {
int n = sip;
recursion(n);
/*for (int i = 0; i < sip; i++) {
System.out.println("sip of a coffee" + n);
n--;
}*/
}
}
private static void recursion(int sip) {
if (sip == 0) {
return;
}
System.out.println("sip of a coffee" + sip);
recursion(sip-1);
}
}
import java.util.Scanner;
public class ForloopToRecursion {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Enter number of sips");
int sip = input.nextInt();
if(sip>=10){
sipCoffee(sip);
}
}
public static void sipCoffee(int sipsRemaining){
// This is your recursions base
// When you reach 0 remaining sips
// you immediately exit the function
// without doing anything
// Note that the test == 0 would also suffice
// here, but
if (sipsRemaining <= 0){
return;
}
// If you reached this part of the code
// you have more than one sip remaining
System.out.println("Take a sip of coffee.");
// To reduce the number of sips you call a
// new instance of the sipCoffee function
// with a reduced number of sipsRemaining
// Note that you are calling the function from
// within itself. This is the recursion step.
sipCoffee(sipsRemaining-1);
} // termination
}
...
sipCoffee(5)
|
| sipCoffee(4)
| |
| | sipCoffee(3)
| | |
| | | sipCoffee(2)
| | | |
| | | | sipCoffee(1)
| | | | |
| | | | | sipCoffee(0)
| | | | | |
| | | | | * terminates
| | | | |
| | | | * terminates
| | | |
| | | * terminates
| | |
| | * terminates
| |
| * terminates
|
* terminates