【问题标题】:A good bank of recursion solutions in C/C++/Java/C# [closed]C/C++/Java/C# 中的大量递归解决方案 [关闭]
【发布时间】:2010-10-12 16:58:39
【问题描述】:

我看到this question,但那里的答案不是很相关。 一位朋友需要一组已解决的递归问题来帮助他为明天的考试而学习。

他从理论上学习了这个问题,但在掌握如何实际解决递归问题时遇到了问题。你知道网上有一个很好的解决递归问题的来源吗(最好是用 C 语言,但也可以是 C 风格的语言)?

注意 - 函数式语言中的示例在这里没有多大帮助。我的朋友正在参加明天通过考试的学习竞赛,我敢肯定,此时切换语言只会让他感到困惑(这可能在其他压力较小的时候具有教育意义)。

【问题讨论】:

  • 该死,我本来打算开递归递归的玩笑,但我看到这是链接线程的第一个答案。
  • 有句老话,“为了理解递归,先理解递归。”
  • 编程语言语法独立于理解递归本身。请考虑函数式语言。
  • 就我个人而言,函数式语言没有问题。因为这是给一个不是CS专业的朋友的,所以我试图简化事情。他有递归的心理恐惧就够了,没必要用LISP吓唬他。

标签: java c++ c recursion


【解决方案1】:

学习递归的最佳方法之一是获得一些函数式编程语言的经验,例如 Haskell、Lisp 或 Scheme。

因此查找递归问题可以简化为查找与函数式编程语言相关的一些问题和答案。这是一个例子99 lisp problems

学习 Scheme 或 Lisp 真的只需要 5 分钟,因此您可以立即开始使用示例,以便明天进行您提到的测试。

学习递归的另一个好方法是练习一些涉及归纳的数学证明。


与递归相关的关键概念:

使用递归,您无需知道如何解决问题。你只需要知道两件事。 1)如何解决问题的最小实例,以及 2)如何将其分解为更小的部分。

同样,您只需要记住您需要:1) 基本情况和 2) 递归情况。

基本案例处理 1 个您想要用最小输入执行的单个实例。

递归案例将问题分解为子问题。最终,这个子问题将简化为基本情况。

例子:

//1+...+n = n*n(+1)/2 = sumAll(n):

int sumAll(int x)
{
  if(x == 0) //base case
    return 0; 
  else
    return sumAll(x-1) + x; //recursive case
}

了解基本情况并不难理解,这一点很重要。它必须存在。这是 x> 0 的等效解决方案:

//1+...+n = n*n(+1)/2 = sumAll(n):
int sumAll(int x)
{
  if(x == 1) //base case
    return 1; 
  else
    return sumAll(x-1) + x; //recursive case
}

【讨论】:

  • Common Lisp 之类的东西太过分了。 Scheme 会很好地工作。
【解决方案2】:

This article 讲解递归,并有一些简单的 C 示例,用于遍历链表和二叉树

【讨论】:

    【解决方案3】:

    这听起来像是一个非常蹩脚的答案,但递归是一种范式,对于初学者来说,一开始通常很难掌握。你的朋友需要一天多的时间思考这个主题才能牢牢掌握这个概念。

    您可能想让他仔细阅读 Project Euler 以了解潜在的学习方向。

    【讨论】:

    • 一天的时间可能不足以仔细研究整个网站。
    • 我不认为它对任何人有任何好处,所有这些“准备好让你大吃一惊:递归来了”的东西。这并不难,但吓唬人会让他们更难。
    • 点了。先生说的很对。我试图(也许是蹩脚)在我的措辞中雄辩地让 ripper234 知道,如果他的朋友还没有在他的学习中,1/2 天和 1 夜不足以掌握这个概念,这是暗示的按问题。
    【解决方案4】:

    我认为 Haskell 的语法非常适合递归思考,因为模式匹配结构使得基本情况和递归情况如此明显。将其翻译成另一种语言就相当简单了。

    sumAll [] = 0
    sumAll (x:xs) = x + sumAll xs
    

    要理解这一点,你真的只需要知道这一点

    • [] 表示一个空列表,
    • (x:xs) 将列表拆分为头部 (x) 和尾部 (xs)

    您不需要学习所有的 Haskell(让我们面对现实,很难) - 但做一些基础知识肯定有助于您在递归中思考。

    【讨论】:

      【解决方案5】:

      在 c /c++ 语言中,函数可以调用自身,这种情况称为递归。递归主要有两种情况:

      1. 基本情况。
      2. 递归案例。

      我们有一些递归类别,比如 as...

      1. 线性递归
      2. 二进制递归
      3. 嵌套递归
      4. 相互递归
      5. 尾递归

      这里举个例子来讨论递归……

      // a recursive program to calculate NcR  //
      #include <stdio.h> 
      int ncr(int x,int y)
      {
          if(y>x)
          {
              printf("!sorry,the operation can't processed.");
              getch();
              exit(1);
          }
          else if(y==0 ||y==x)   //base case
          {
              return(1);
          }
          else
          {
              return(ncr(x-1,y-1)+ncr(x-1,y));  //recursive case
          }
      }
      

      【讨论】:

        【解决方案6】:

        阅读SICP(Structure and Interpretation of Computer Programs)

        【讨论】:

          【解决方案7】:
          #include<iostream>
          using namesspace std;
          int E(int x);
          int main()
          {
              int x;
              cout << E(x) << endl;
              return 0;
          }
          
          int E(int x)
          {
              return x ? (x % 10 + E(x/10)) : 0;
          }
          

          【讨论】:

            猜你喜欢
            • 2021-07-15
            • 1970-01-01
            • 1970-01-01
            • 2020-08-09
            • 1970-01-01
            • 2014-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多