递归方法的返回值(java)

时间:2018-08-23 16:50:17

标签: java recursion

我必须编写一个递归方法来对整数进行求和。

该方法工作正常,但我不明白为什么它返回最后一个整数而不是总数。

import java.util.Scanner;

public class SommaCifreRicorsivo{
    public static void main (String[] args){
        System.out.printf("Inserire un numero: ");
        Scanner tastiera = new Scanner(System.in);
        int numero = tastiera.nextInt();
        int somma = 0;

        int risultato = eseguiSomma(numero,somma);
        System.out.println("La somma delle sue cifre è " + risultato);
    }

    public static int eseguiSomma(int numero, int somma){
        //Caso base
        if (numero < 10) {
            somma = somma + numero;
            System.out.println("Aggiungo la cifra " + numero + " alla somma, ottenendo " + somma);
            return (somma += numero);
        }

        //Chiamate ricorsive
        somma = somma + numero%10;
        System.out.println("Aggiungo la cifra " + (numero%10) + " alla somma, ottenendo " + somma);
        eseguiSomma((numero/10), somma);

        return somma;

    }
} 

2 个答案:

答案 0 :(得分:1)

somma是基本类型(int),因此Java按值传递它。这意味着您要修改的值只是存储在每个递归调用的堆栈帧中的somma副本,而不是最终的返回值。

因此,参数somma完全没有必要。相反,您应该返回递归调用的返回值加上新的数字。这提供了一个简单得多的解决方案。

public static int eseguiSomma(int numero){
    //Caso base
    if (numero < 10) {
        return numero;
    }

    //Chiamate ricorsive
    return numero % 10 + eseguiSomma(numero / 10);
}

// now simply call without somma
int risultato = eseguiSomma(numero);

答案 1 :(得分:0)

只需将其更正为:

import java.util.Scanner;

public class SommaCifreRicorsivo{
    public static void main (String[] args){
        System.out.printf("Inserire un numero: ");
        Scanner tastiera = new Scanner(System.in);
        int numero = tastiera.nextInt();
        int somma = 0;

        int risultato = eseguiSomma(numero,somma);
        System.out.println("La somma delle sue cifre è " + risultato);
    }

    public static int eseguiSomma(int numero, int somma){
        //Caso base
        if (numero < 10) {
            somma = somma + numero;
            System.out.println("Aggiungo la cifra " + numero + " alla somma, ottenendo " + somma);
            return (somma += numero);
        }

        //Chiamate ricorsive
        somma = somma + numero%10;
        System.out.println("Aggiungo la cifra " + (numero%10) + " alla somma, ottenendo " + somma);

        // the error was on this line!
        somma += eseguiSomma((numero/10), somma);

        return somma;

    }
} 

您正在尝试修改somma,但是somma是原始类型,因此您只能修改其本地副本,而somma保持不变。