【问题标题】:Proof by induction of a recursive pseudo code | skiena algorithm book递归伪代码归纳证明|斯基纳算法书
【发布时间】:2023-12-20 10:10:02
【问题描述】:

在《算法设计手册》(第 16 页)一书中,讨论了通过归纳证明以下增量算法的正确性

Increment(y)
    if (y == 0) return 1;
    else if (y % 2 == 1) return 2 * Increment(floor(y/2));
    else return y + 1;

但我在讨论中的某一点(或假设)感到困惑。请求解决方案(通过归纳证明正确性)以更好地理解。

【问题讨论】:

  • 你对什么感到困惑,他们证明了什么?正确吗?运行时间?你的问题太模糊了
  • 也许你应该告诉我们你感到困惑的地方。在这里制作相同的解释不会对您有所帮助,详细解释每个部分只会浪费每个人(包括您的)的时间。此外,问题不应依赖于外部资源 - 您应在此处复制相关详细信息。
  • 正确性,编辑了问题。 @Makogan

标签: algorithm recursion induction


【解决方案1】:

基本情况 y=0:

通过第一条语句,输出为0+1 = 1 = y+1;

归纳假设:假设对于 0

我们试图证明 increment(y) 返回 y+1。

平凡的情况,y 是偶数(对于某些 k,y=2k):

那么y%2为0,if子句为false,返回值为y+1;

奇数情况:

假设 y = 2k+1(奇数)然后 floor(y/2) = k 并且这样:

increment(floor(y/2))=increment(k) = k+1

所以,

2*increment(floor(y/2)) = 2k+2 = y+1

QED

【讨论】: