返回值如何在递归方法中工作? [Java]
How does returning a value work in a recursive method? [Java]
TLDR : java 似乎只有 return 方法为 运行 时的第一个值。我对此有错吗,或者是否有我不知道的解决方法[不求助于循环]?
我的目标是输出分配给方法的 return 的最后一个值 [boolean],但是如果不正确理解 return 的工作原理,我将无法做到这一点。
代码的目的是 return 一个布尔值,从一个简单的选择 [Y/N] 通过读取用户输入。如果给出了错误的输出[例如:"p"、"P"、"apples"],该方法应该再次提示用户,直到给出正确的输入。
我是这样开始的:
private Boolean nrCheck()
{
Scanner sc = new Scanner (System.in);
Boolean isNewRelease;
System.out.println("New Release [Y/N]? ");
String movieType = sc.nextLine();
switch (movieType)
{
case "Y" : case "y" : isNewRelease = true; break;
case "N" : case "n" : isNewRelease = false; break;
default : /*Try again*/ nrCheck(); break;
}
return isNewRelease;
}
显然这行不通,因为 default case 没有赋值,
导致 初始化错误。
尝试通过分配默认值来解决此问题,如下所示:
private Boolean nrCheck()
{
Scanner sc = new Scanner (System.in);
Boolean isNewRelease;
System.out.println("New Release [Y/N]? ");
String movieType = sc.nextLine();
switch (movieType)
{
case "Y" : case "y" : isNewRelease = true; break;
case "N" : case "n" : isNewRelease = false; break;
default : /*printTryagain*/ isNewRelease = null; nrCheck();break;
}
return isNewRelease;
}
这提出了一个新问题。出于某种原因,当我再次调用该方法时,return 值已经设置。我试过调整代码的顺序,但并没有起到多大作用。我的推测是,一旦你调用了这个方法,return值就自动设置了,第一次设置就不能更改了。
而且我知道我可以做到,
private Boolean nrCheck()
{
Scanner sc = new Scanner (System.in);
Boolean isNewRelease;
System.out.println("New Release [Y/N]? ");
String movieType = sc.nextLine();
do
{
switch (movieType)
{
case "Y" : case "y" : isNewRelease = true; break;
case "N" : case "n" : isNewRelease = false; break;
default : /*printTryagain*/ isNewRelease = null; nrCheck();break;
}
}
while (movieType.equalsIgnoreCase("Y") || movieType.equalsIgnoreCase("N"))
return isNewRelease;
}
但我个人不愿意这样做,除非我完全意识到没有其他解决方案,或者我的代码中没有明显的错误。 [还想扩展此代码以变得更通用]。
最终,我希望能够理解我犯了什么错误,或者如果没有,return 在这种情况下的局限性,即使这意味着我必须废弃我的代码对于一个 do-while 循环。
您应该 return 递归调用 return 的值:
private boolean nrCheck()
{
Scanner sc = new Scanner (System.in);
System.out.println("New Release [Y/N]? ");
String movieType = sc.nextLine();
switch (movieType)
{
case "Y" : case "y" : return true;
case "N" : case "n" : return false;
default : return nrCheck();
}
}
如果您忽略该值,那么首先进行递归调用就没有意义。
P.S.,你可以将方法的 return 类型更改为 boolean
,因为它永远不会 return null
.
我认为您在这里甚至不需要递归,而且您似乎没有正确理解递归的用途。您对 do
循环的第三次尝试是轮询用户输入的典型方式:
private boolean nrCheck() {
Scanner sc = new Scanner (System.in);
boolean isNewRelease;
System.out.println("New Release [Y/N]? ");
menuRedirect(movieType); // don't know what this is doing...
do {
String movieType = sc.nextLine();
} while (!movieType.equalsIgnoreCase("Y") && !movieType.equalsIgnoreCase("N"));
// at this point, the movie type can only be y/Y/n/N
isNewRelease = movieType.equalsIgnoreCase("Y") ? true : false;
return isNewRelease;
}
按照下面给出的方法稍作改动
private Boolean nrCheck() {
Scanner sc = new Scanner(System.in);
Boolean isNewRelease = null;
//While loop here which break only if isNewRelease value is
//Non null(true or false)
while (isNewRelease == null) {
System.out.println("New Release [Y/N]? ");
String movieType = sc.nextLine();
menuRedirect(movieType);
switch (movieType) {
case "Y":
case "y":
isNewRelease = true;
break;
case "N":
case "n":
isNewRelease = false;
break;
default:
System.out.println("Try Again");
/*I removed recursive call which not required because recursive calls always creates new stack frames so it is recommenced that if we are going to use such calls we need to go with tail recursion.*/
isNewRelease = null;
break;
}
}
return isNewRelease;
}
TLDR : java 似乎只有 return 方法为 运行 时的第一个值。我对此有错吗,或者是否有我不知道的解决方法[不求助于循环]?
我的目标是输出分配给方法的 return 的最后一个值 [boolean],但是如果不正确理解 return 的工作原理,我将无法做到这一点。
代码的目的是 return 一个布尔值,从一个简单的选择 [Y/N] 通过读取用户输入。如果给出了错误的输出[例如:"p"、"P"、"apples"],该方法应该再次提示用户,直到给出正确的输入。
我是这样开始的:
private Boolean nrCheck()
{
Scanner sc = new Scanner (System.in);
Boolean isNewRelease;
System.out.println("New Release [Y/N]? ");
String movieType = sc.nextLine();
switch (movieType)
{
case "Y" : case "y" : isNewRelease = true; break;
case "N" : case "n" : isNewRelease = false; break;
default : /*Try again*/ nrCheck(); break;
}
return isNewRelease;
}
显然这行不通,因为 default case 没有赋值, 导致 初始化错误。
尝试通过分配默认值来解决此问题,如下所示:
private Boolean nrCheck()
{
Scanner sc = new Scanner (System.in);
Boolean isNewRelease;
System.out.println("New Release [Y/N]? ");
String movieType = sc.nextLine();
switch (movieType)
{
case "Y" : case "y" : isNewRelease = true; break;
case "N" : case "n" : isNewRelease = false; break;
default : /*printTryagain*/ isNewRelease = null; nrCheck();break;
}
return isNewRelease;
}
这提出了一个新问题。出于某种原因,当我再次调用该方法时,return 值已经设置。我试过调整代码的顺序,但并没有起到多大作用。我的推测是,一旦你调用了这个方法,return值就自动设置了,第一次设置就不能更改了。
而且我知道我可以做到,
private Boolean nrCheck()
{
Scanner sc = new Scanner (System.in);
Boolean isNewRelease;
System.out.println("New Release [Y/N]? ");
String movieType = sc.nextLine();
do
{
switch (movieType)
{
case "Y" : case "y" : isNewRelease = true; break;
case "N" : case "n" : isNewRelease = false; break;
default : /*printTryagain*/ isNewRelease = null; nrCheck();break;
}
}
while (movieType.equalsIgnoreCase("Y") || movieType.equalsIgnoreCase("N"))
return isNewRelease;
}
但我个人不愿意这样做,除非我完全意识到没有其他解决方案,或者我的代码中没有明显的错误。 [还想扩展此代码以变得更通用]。
最终,我希望能够理解我犯了什么错误,或者如果没有,return 在这种情况下的局限性,即使这意味着我必须废弃我的代码对于一个 do-while 循环。
您应该 return 递归调用 return 的值:
private boolean nrCheck()
{
Scanner sc = new Scanner (System.in);
System.out.println("New Release [Y/N]? ");
String movieType = sc.nextLine();
switch (movieType)
{
case "Y" : case "y" : return true;
case "N" : case "n" : return false;
default : return nrCheck();
}
}
如果您忽略该值,那么首先进行递归调用就没有意义。
P.S.,你可以将方法的 return 类型更改为 boolean
,因为它永远不会 return null
.
我认为您在这里甚至不需要递归,而且您似乎没有正确理解递归的用途。您对 do
循环的第三次尝试是轮询用户输入的典型方式:
private boolean nrCheck() {
Scanner sc = new Scanner (System.in);
boolean isNewRelease;
System.out.println("New Release [Y/N]? ");
menuRedirect(movieType); // don't know what this is doing...
do {
String movieType = sc.nextLine();
} while (!movieType.equalsIgnoreCase("Y") && !movieType.equalsIgnoreCase("N"));
// at this point, the movie type can only be y/Y/n/N
isNewRelease = movieType.equalsIgnoreCase("Y") ? true : false;
return isNewRelease;
}
按照下面给出的方法稍作改动
private Boolean nrCheck() {
Scanner sc = new Scanner(System.in);
Boolean isNewRelease = null;
//While loop here which break only if isNewRelease value is
//Non null(true or false)
while (isNewRelease == null) {
System.out.println("New Release [Y/N]? ");
String movieType = sc.nextLine();
menuRedirect(movieType);
switch (movieType) {
case "Y":
case "y":
isNewRelease = true;
break;
case "N":
case "n":
isNewRelease = false;
break;
default:
System.out.println("Try Again");
/*I removed recursive call which not required because recursive calls always creates new stack frames so it is recommenced that if we are going to use such calls we need to go with tail recursion.*/
isNewRelease = null;
break;
}
}
return isNewRelease;
}