【问题标题】:Java 1 student totally lost. Recursion programJava 1 学生完全迷路了。递归程序
【发布时间】:2017-01-29 01:59:41
【问题描述】:

您好,第一个 Java 类,它似乎每分钟走一英里。我们学习某个主题的基础知识,并被要求为更高级的程序编写代码,而不是帮助我们了解该主题。

编写一个以整数为输入的递归程序。该程序获取数字中的每个数字并将它们全部相加,并以新的和重复,直到结果为单个数字。

你的输出应该是这样的:

################### 输出示例 1

输入一个数字:96374

我在计算.....

第 1 步:9 + 6 + 3 + 7 + 4 = 29

第 2 步:2 + 9 = 11

第 3 步:1 + 1 =2

3个步骤终于个位数!!!!!

你的答案是 2。

我了解 java 用来产生我想要的输出的数学。在学习了递归的基础知识后,我可以做到这一点。但是仅设置代码的布局和格式,我就迷路了。我遇到了一些有道理的错误,但由于缺乏经验而无法纠正。

package numout;
import java.util.Scanner;
public class NumOut {


   public static void main(String[] args) {
       System.out.print("Enter number: ");
       Scanner scan = new Scanner(System.in);
       int n = scan.nextInt(); 
       System.out.println(n);
   }
   public int sumDigit(int n){
       int sum = n % 9;
       if(sum == 0){
           if(n > 0)
               return 9;
       }
       return sum;
   }    
}

输出复制了用户输入给出的代码,这是可以理解的。 当我试图把它分成两部分时,我很难打电话给第二类。我也知道我不是soprln n,也不是总和。所以我试着把它合二为一,我可以看到问题,但不知道如何找到解决方案。

【问题讨论】:

  • 查看这个用 Java 编写的斐波那契递归程序的解释:Java recursive Fibonacci sequence。这应该能让您深入了解您需要做什么。
  • 这个问题太模糊了。有人可以真正回答它的唯一方法是为您编写代码,我希望他们不会这样做。您需要将其缩小到一个特定的问题,即为什么代码没有按照您期望的方式工作。我建议你从忘记递归和多个步骤开始——你能写一个程序来接受一个整数并输出它的数字之和吗?
  • 您需要简单地返回传入参数的 mod10 并通过传入所述参数除以 10 将其添加到调用本身。不要忘记检查 0 以便您可以从您的功能。
  • 再一次,我不想含糊其辞或获取代码。只是想了解我猜的格式。我什至不确定。我完全理解 mod 10. mod 一般,但那是数学。将其转换为代码是我卡住的地方。练习/重复是否会变得更容易。这就像我被卡住的障碍。是否有任何唯一可以生成简单场景(启动/创建程序)的程序,我必须用代码来解决。我觉得那将是一个很好的开始。

标签: java recursion conditional


【解决方案1】:

将递归视为通过将问题分解为较小的类似问题来解决问题。您还需要有一个问题是如此之小以至于解决方案是显而易见的,或者至少很容易计算的情况。例如,在练习对一个数字的数字求和时,您需要将个位数字添加到所有其他数字的总和中。请注意,sum of all the other digits 描述了同一问题的较小版本。在这种情况下,最小的问题将是只有一个数字的问题。

这一切的意思是,您需要编写一个方法sumDigits(int num),它采用num 的个位数字,并通过递归调用具有较小数字的sumDigits() 将其添加到其他数字的总和中。

【讨论】:

  • 另外,请注意递归程序涉及两件事:1. 递归调用(带有所需的参数) 2. 将停止后续递归调用的停止条件(通常是最小的问题)。
  • @Code-Apprentice 。感谢您的口头输入,它比您想象的更有帮助。为了我的智力健康,我将遵循什么路径来创建没有递归或循环(for/while)的相同程序。我再次看到我们需要一个基本情况,然后使用模式 10,但我从那里开始不知所措。
  • @mbish75 我认为没有递归或循环就无法做到这一点。您必须多次重复相同的步骤,这是我们的两个很好的重复选项。
  • @mbish75 你说得对,mod 10 给出了个位数。你如何得到其余的数字(从十位开始)?
  • @Code-Apprentice 。这就是我的假设。我的教授补充问题是: 2. 这次你必须努力思考以改进你的程序。编写一个单独的程序来完成相同的工作,但不执行所有步骤。您必须在不使用任何循环(for/while)或递归的情况下执行此操作。您的输出应该看起来完全像这样:######################## 输出################ ########### 输入数字:96374 这很简单!!!你的答案是 2。
【解决方案2】:

这就是你需要做的:基本上你没有在你的代码中使用任何recursion。递归基本上是函数调用自身。不要被语言吓倒,一旦你开始经常这样做,你就会享受解决问题的乐趣。

public static void main(String []args){

    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt(); 
    printSingleDightSum(n);
 } 
 public static void printSingleDightSum(int N) {
     int sum = 0;
     int num = N;

     while(num !=0 ){
         int a = num%10;
         sum + = a;
         num = num/10;
     }
     if(sum < 10) {
         System.out.println('single digit sum is '+sum);
         return;

     } else {
         printSingleDightSum(sum);
     }
 }

【讨论】:

    【解决方案3】:

    这是代码,我稍后会添加 cmets 和解释,但现在这里是代码:

    package numout;
    import java.util.Scanner;
    
    public class NumOut {
    
        public static void main(String[] args) {
            System.out.println("################### output example 1");
            System.out.print("Enter number: ");
            final int n = new Scanner(System.in).nextInt(); 
            System.out.print("\nI am Calculating.....");
            sumSums(n, 1);
        }
    
        public static int sumSums(int n, int step) {
            System.out.print("\n\nStep " + step + " : ");
            final int num = sumDigit(n);
            System.out.print("= " + num);
            if(num > 9) {
                sumSums(num, step+1);
            }
            return num;
        }
    
        public static int sumDigit(int n) {
    
            int modulo = n % 10;
    
            if(n == 0) return 0;
    
            final int num = sumDigit(n / 10);
    
            if(n / 10 != 0)
                System.out.print("+ " + modulo + " ");
            else
                System.out.print(modulo + " ");
    
            return modulo + num;
    
        }
    
    }
    

    【讨论】:

    • 有没有一种方法可以在没有递归的情况下执行这个程序:循环、if/then、return。 @布雷特邓肯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2011-11-23
    相关资源
    最近更新 更多