C++ 递归函数的迷失证明

C++ 递归函数的迷失证明,c++,recursion,discrete-mathematics,proof-of-correctness,C++,Recursion,Discrete Mathematics,Proof Of Correctness,离散数学很有趣,但我在代数方面仍然有很多困难。我试图通过归纳法证明一个递归函数。我刚开始学习算法设计课程,任务是将迭代函数重写为递归函数,然后证明它。我能够实现递归函数,并且能够使用蛮力技术对其进行测试,但是我不知道如何建立我的证明。我认为我没有正确地启动它。我把我的开始和证据放在一起。谢谢你给我的建议 编辑#3感谢帮助完成最终校对 f (k + 1) – f(k) = (k + 1) ^2 – ½ (k + 1) (k + 1 – 1) – k^2 – ½ (k (k -1)) = k^2

离散数学很有趣,但我在代数方面仍然有很多困难。我试图通过归纳法证明一个递归函数。我刚开始学习算法设计课程,任务是将迭代函数重写为递归函数,然后证明它。我能够实现递归函数,并且能够使用蛮力技术对其进行测试,但是我不知道如何建立我的证明。我认为我没有正确地启动它。我把我的开始和证据放在一起。谢谢你给我的建议

编辑#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
 */
/*
杰劳利
正确性证明1.cpp
这为我的算法提供了一个强力的证明
最初,一切都是整数类型。
当我加入战俘时,我变成了双倍。
*/
#包括“stdafx.h”
#包括
//这是原始函数
//我们将把它重写为一个递归函数
//所以证明会更简单
双三角形(双n){
自动结果=0;
对于(自动i=1;i=0
双三角递归(双n){
返回(n==1)?n:三角递归(n-1)+n;
}
//返回n^2-(n(n-1))/2
//用蛮力检验我理论的实用方法
双重测试理论(双n)
{
返回功率(n,2)-(n*(n-1))/2;
}
内部主(空)
{
//当值远远超过4000时,此循环失败
//已添加编辑-失败是由于值太大
//发生这种情况时,程序崩溃
//这是使用递归函数的一个缺点

对于(auto i=1;i,递归函数通常具有如下形式:

recursive(param) {
    if (base_case)
        return base_value;

    new_param = move_param_toward_base(param);
    return combine(present_value, recursive(new_param);
}
归纳证明基本上有两个步骤:

  • 证明一些(通常是琐碎的)基本情况
  • 证明一些扩展它的方法,这样,如果基本情况是真的,那么对于一些更大的输入集,扩展版本仍然是真的
  • 证明扩展可以或多或少任意应用,因此结果对于所有输入都是正确的
  • 使用递归函数:

  • 表明您已正确检测并处理基本情况
  • 您可以证明对其他值的扩展是正确的
  • 您表明,您正在以一种方式修改参数,这种方式将在有限的步骤中产生基本情况

  • 但是,也有一些不同,包括你在这里遇到的那个。特别是在数学中,非模数可以无限增长——但在计算机上,所有的数都是模数;没有一个数可以无限增长。

    递归函数通常有如下形式:

    recursive(param) {
        if (base_case)
            return base_value;
    
        new_param = move_param_toward_base(param);
        return combine(present_value, recursive(new_param);
    }
    
    归纳证明基本上有两个步骤:

  • 证明一些(通常是琐碎的)基本情况
  • 证明一些扩展它的方法,这样,如果基本情况是真的,那么对于一些更大的输入集,扩展版本仍然是真的
  • 证明扩展可以或多或少任意应用,因此结果对于所有输入都是正确的
  • 使用递归函数:

  • 表明您已正确检测并处理基本情况
  • 您可以证明对其他值的扩展是正确的
  • 您表明,您正在以一种方式修改参数,这种方式将在有限的步骤中产生基本情况

  • 但是,也有一些不同,包括你在这里遇到的那个。特别是在数学中,一个非模数可以无限增长——但是在计算机上,所有的数都是模的;没有一个可以无限增长。

    //当值远远超过4000时,这个循环失败
    到底失败了什么?值变成了什么太大且程序崩溃为什么使用
    pow(n,2)
    而不是只乘以
    n*n
    ?整数算法(后者)是精确的,而浮点是近似值。您展示了基本情况。现在只需将值k和k-1插入您的猜想,并显示两者之间的差异为k。@pjs谢谢。至于我为什么使用pow?我真的没有很好的理由。
    //在值远远超过4000时,此循环失败
    到底失败了什么值变得太大,程序崩溃为什么使用
    pow(n,2)
    而不是只乘以
    n*n
    ?整数算法(后者)是精确的,而浮点是近似值。你展示了基本情况。现在只需将值k和k-1插入你的猜想,并显示两者之间的差异为k。@pjs谢谢。至于我为什么使用pow?我真的没有很好的理由。这是否意味着我的post条件没有数学证明?如果你指的是蛮力测试,我很清楚它的局限性,我甚至不认为它是一个有效的测试-它更像是一个检查。我需要一个实际的数学证明。@杰姆斯表明它是正确的基本情况,如果它是正确的K,它是真实的K + 1。(或者,案例k+1和k之间的差异是递归更新量)是一个数学证明。我想困扰我的是,在插入所有值后,我的结果将与我在post条件中使用的形式相同:n^2-1/2(n(n-1))但是我得到的解决方案看起来一点也不像。@James你试过逐字计算
    f(k+1)-f(k)吗
    对于你猜测的答案?如果你是对的,它应该会产生
    k+1
    ,从你的递归中更新。明白了。谢谢你们两个坚持我的观点。我正在整理一个干净的解决方案,不久将发布。这是否意味着我的post条件没有数学证明?如果你指的是b摩擦力测试,我很清楚这些局限性,我甚至不认为它是一个有效的测试-它是一个更大的检查。我需要一个实际的数学证明。”杰姆斯表明,这是真实的基础。