查找 GCD:并非所有控制路径都返回值
finding gcd: not all control paths return a value
int gcd(int a, int b) {
if (b == 0)
return a;
else {
gcd(b, a % b);
}
}
当我试图计算最大公约数时, 我知道我必须打电话给return gcd(b,a%b)
而不是gcd(b,a%b)
. 但我不明白原因。 b在某个时候不会变成0吗?
第一次调用函数时。 如果b!=0
它将继续执行else gcd(b, a % b);
但是您第一次调用的函数没有返回值。
以下代码将帮助您了解递归:
int gcd(int a, int b) {
if (b == 0)
return a;
else {
return gcd(b, a % b);
}
}
int calc_gcd(int a, int b) {
if (b == 0)
return a;
else {
gcd(b, a % b);
// return ?
}
}
调用函数calc_gcd
等效于在代码中调用gcd
。 缺少返回值。 正确的递归函数的工作方式如下:
gcd0 ... return value to user
gcd1 .... ↑
gcd2 .... ↑
gcd3 .... pass value to ↑
你真的不必做
return gcd(b,a%b)
但这是最简单的方法。
您似乎明白,在所有情况下都必须从具有类似头部的函数中返回一个 int
int gcd(int a, int b)
在 if 的两个分支中执行操作是一种简短的方法。
可以说,对于可读性、可维护性、健壮性等次要目标,int-return 函数的最后一个语句应该始终是return SomeInt;
。但是,要做到这一点并不容易,因为许多静态分析工具也不会抱怨"无法访问代码"。一个局部变量int returnValue
,初始化为明智选择的默认值并写入所有分支中,可以让你到达那里。
但同样,一些工具会抱怨将值写入变量,然后在使用之前总是被覆盖......因此,默认的初始化可能是a
,然后不会在"then"中被覆盖。让分析工具快乐有时是一种循环游戏......
顺便说一下,你显示的代码可能(绝对不能保证(确实有效,因为编译器有时会默认返回最后一个计算结果,即使它被忽略了。但你绝对不应该依赖它,并且应该得到任何你得到的抱怨,无论是人类还是工具。我们可以放心地认为这是一个坏主意(tm(。
相关文章:
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- 查找 GCD:并非所有控制路径都返回值
- 不断收到错误消息,并非所有控制路径都返回值
- C++ - 通过在控制台中包含 csv 文件的路径来读取和写入 csv 文件
- "警告:并非所有控制路径都返回值"是什么意思?(C++)
- “并非所有控制路径都返回一个值./&quot“控制可能达到非空隙功能的末端”.验证时循环时
- 接收并非所有控制路径返回值的警告
- 获取错误:警告C4715::并非所有控制路径都返回值,但不确定原因
- 此功能是否具有所有控制路径上的明确返回值
- 警告 C4715:'bankingMenu':并非所有控制路径都返回值 (C++)
- Visual C++开关控制路径陷入僵局
- 警告 C4715:"运算符==":并非所有控制路径都返回值
- 警告C4715:并非所有控制路径都返回值c++
- 当与指针进行比较时,行使所有可能的控制路径意味着什么
- 错误:并非所有控制路径都返回值
- C++ // 并非所有控制路径都返回值
- 并非所有控制路径都返回布尔值
- 不是所有控制路径都返回值?警告
- 警告 C4715:'d2cs_conn_set_addr':并非所有控制路径都返回值