Java 递归(返回语句)
在java中使用递归解决codeforces中的问题时,我遇到了一个问题Java 递归(返回语句),java,c++,recursion,Java,C++,Recursion,在java中使用递归解决codeforces中的问题时,我遇到了一个问题 package codeforces; import java.util.Scanner; public class NewClass11 { static int solve(int x, int y, int count) { if (x > y) { return count; } else { c
package codeforces;
import java.util.Scanner;
public
class NewClass11 {
static int solve(int x, int y, int count)
{
if (x > y) {
return count;
}
else {
count++;
x = x * 3;
y = y * 2;
solve(x, y, count);
}
//here return statement required
}
public
static void main(String[] args)
{
Scanner ob = new Scanner(System.in);
int x = ob.nextInt();
int y = ob.nextInt();
int count = 0;
System.out.println(solve(x, y, count));
}
}
#include <iostream>
using namespace std;
int solve(int x, int y, int count)
{
if (x > y) {
return count;
}
else {
count++;
x = x * 3;
y = y * 2;
solve(x, y, count);
}
}
int main()
{
int x, y;
cin >> x >> y;
int count = 0;
cout << solve(x, y, count);
}
#包括
使用名称空间std;
整数解算(整数x,整数y,整数计数)
{
如果(x>y){
返回计数;
}
否则{
计数++;
x=x*3;
y=y*2;
求解(x,y,count);
}
}
int main()
{
int x,y;
cin>>x>>y;
整数计数=0;
库特
<>但是为什么这不是像C++代码那样工作?< /P>
因为C++与java不同。
<>这一点的不同之处在于C++不要求非空函数的所有分支都返回。所示C++程序是良好的,因此编译。相反,如果函数执行到最后一个卷曲括号而没有返回语句,程序的行为是未定义的。
C++代码,运行良好
<>它没有“工作得很好”。C++程序的行为是未定义的。< /P>
任何值得使用的编译器都会对这种情况发出警告。默认情况下,GCC、Clang和MSVC会对显示的程序发出警告
请给我另一个建议
没有“另一种方法”。按照IDE的建议,通过添加缺少的return语句来修复程序
<>但是为什么这不是像C++代码那样工作?< /P>
因为C++与java不同。
<>这一点的不同之处在于C++不要求非空函数的所有分支都返回。所示C++程序是良好的,因此编译。相反,如果函数执行到最后一个卷曲括号而没有返回语句,程序的行为是未定义的。
C++代码,运行良好
<>它没有“工作得很好”。C++程序的行为是未定义的。< /P>
任何值得使用的编译器都会对这种情况发出警告。默认情况下,GCC、Clang和MSVC会对显示的程序发出警告
请给我另一个建议
<> P>没有“另一种方式”。通过添加缺省返回语句来修复程序,如IDE中所建议的。< /P> <代码>返回解决(x,y,计数)< /C> >在递归方法中。java强制编译此程序。C++只在编译时强制执行此项操作,而未定义的行为。因为当<代码>(x>y)时,是false,则该方法不返回任何东西,它需要返回一个<代码> int 。它与递归无关。java中的每一个方法都需要返回它所广告的东西。它会返回。C++代码可以编译,但它会给出错误的结果,因为它和java代码有相同的错误。只是C++接受。如果你在函数中没有明确地使用<代码>返回<代码>,它应该返回一个<代码> nt<代码>,然后默默地返回一些无效的东西…哇,17列深缩进:但是,如果我用C++编写代码,那就很好。-或者你相信。你的C++代码在执行代码时调用了<代码>中的未定义的行为。其中条件(x>y)
为false。这似乎在您使用的任何配置/工具链中都有效,这只会助长您的误导。代码是错误的。solve
中采用的并非所有代码路径都提供正确的返回
结果。返回求解(x,y,count)在你的递归方法中,java强制执行这个。C++只在编译时部分地执行这个,你在未定义的行为中有什么。因为当<代码>如果(x> y)是false,则该方法不返回任何东西,它需要返回一个<代码> int 。它与递归无关。java中的每一个方法都需要返回它所广告的东西。它会返回。C++代码可以编译,但它会给出错误的结果,因为它和java代码有相同的错误。只是C++接受。如果你在函数中没有明确地使用<代码>返回<代码>,它应该返回一个<代码> nt<代码>,然后默默地返回一些无效的东西…哇,17列深缩进:但是,如果我用C++编写代码,那就很好。-或者你相信。你的C++代码在执行代码时调用了<代码>中的未定义的行为。其中条件(x>y)
为false。无论您使用何种配置/工具链,这似乎都会起作用,这只会助长您的误导。代码是错误的。solve
中采用的并非所有代码路径都能提供正确的返回结果。