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