失去了递归功能的证明

Lost in Proof for Recursive function

本文关键字:证明 功能 递归 失去      更新时间:2023-10-16

离散数学很有趣,但是我仍然很难涉及的代数。我试图通过归纳来证明递归功能。我刚刚开始使用算法设计课程,任务是将迭代功能重写为递归功能,然后证明它。我能够实施递归功能,并且能够使用蛮力技术来对其进行测试,但是我对如何设置证明感到不知所措。我认为我没有正确地开始。我开始了证明。感谢您的任何指示,您可以给我。

编辑#3最终证明完成了,多亏了帮助

f (k + 1) – f(k) = 
(k + 1) ^2 – ½ (k + 1) (k + 1 – 1) – k^2 – ½ (k (k -1)) =
k^2 + 2k + 1 – ½ (k^2 – k) – k^2 + ½ (k^2 - k) =  
2k + 1 - k =
k + 1

编辑#2这是我到目前为止的证明,我确定我会离开。

Base Case, n = 1
When n is 1, 1 is returned        Line 1
 1^2-(1*(1-1))/2 = 1
Inductive Case, n > 1
Assume for k = n-1, show for n = k
triangular_recursive(k) =
triangular_recursive (k -1) + k =        Line 1
(k – 1) ^2 – ½(k-1) (k-1-1) + k =      Inductive Assumption
k^2 -2k +1 – ½ (k^2 -3k +2) + k =
k^2 – k + 1 – ½ (k^2 -3k + 2)
This doesn’t see, correct at all.

以下是我的代码:

    /*
 JLawley
 proof_of_correctness1.cpp
 This provides a brute force proof of my algorithm
 Originally, everything was integer type.
 I changed to double when I added pow.
 */
#include "stdafx.h"
#include <iostream>
// this is the original function
// we were to rewrite this as a recursive function
// so the proof would be simpler
double triangular(double n) {
    auto result = 0;
    for (auto i = 1; i <= n; i++) result += i;
    return result;
}
/*
 * This is my recursive implementation
 * It includes base case and post case
 */
// n > 0
double triangular_recursive(double n) {
    return  (n == 1) ? n : triangular_recursive(n - 1) + n;
}
// returns n^2 - (n(n-1)) / 2
// utility method to test my theory by brute force
double test_my_theory(double n)
{
    return pow(n, 2) - (n * (n - 1))/2;
}
int main(void)
{
    // at values much beyond 4000, this loop fails
   // edit added - the failure is due to values too large
   // the program crashes when this occurs
   //  this is a drawback of using recursive functions
    for (auto i = 1; i <= 4000; i++) 
        if (test_my_theory(i) != triangular_recursive(i) || test_my_theory(i) != triangular(i)) 
            std::cout << "n!= at i = " << i;
    // I am not getting any "i ="'s so I assume a good brute force test
    return 0;
}
/*
 * My proof so far:
Base Case, n = 1
When n is 1, 1 is returned        Line 1
 1^2-(1*(1-1))/2 = 1
Inductive Case, n > 1
Assume for k = n-1, show for n = k
triangular_recursive(k) =
triangular_recursive (k -1) + k =        Line 1
(k – 1) ^2 – ½(k-1)(k-1-1) + k =      Inductive Assumption
 */

递归函数通常具有类似的形式:

recursive(param) {
    if (base_case)
        return base_value;
    new_param = move_param_toward_base(param);
    return combine(present_value, recursive(new_param);
}

归纳证明基本上有两个步骤:

  1. 证明了一些(通常是微不足道的)基本案例。
  2. 证明了某种扩展它的方法,因此,如果基本情况为真,则您的扩展版本对于某些较大的输入集仍然是正确的。
  3. 证明可以或多或少地使用扩展名,因此所有输入的结果仍然是正确的。

具有递归功能:

  1. 您证明您已经正确检测并处理了基本案例。
  2. 您表明您对某些其他值的扩展是正确的。
  3. 您表明您正在以有限数量的步骤来修改参数。

但是,还有一些差异,包括您似乎正在遇到的差异。特别是,在数学中,非模块数可以在没有限制的情况下增长 - 但在计算机上,所有数字都是模块化的。它们都无法生长而没有限制。