柳叶初零吧 关注:8贴子:598
  • 8回复贴,共1

俺要不要码个一般递归的模版捏?

只看楼主收藏回复

俺要不要码个一般递归的模版捏?


IP属地:广东1楼2011-03-01 10:52回复
    我感觉一般递归求解问题按以下步骤:
    1.是否可以直接求解?
      是,则求解并返回;
      否,转2;
    2.求解这个大问题先要解决什么子问题?递归调用自身,KO之;
    3.【子问题KO了,这个大问题在此求解】。(有些只要求结果不要求过程的可能没有这一步)


    IP属地:广东2楼2011-03-01 13:13
    回复
      于是下面剧透………………
      九连环问题递归函数“拆装”基本思路:
      1.如果是第一个环,则拆装它,并记录输出;
      2.不是第一个环:
        1)若前一个未装上,则将其装上;
          2)若再前面的未拆下,则将其拆下; (这两步一定注意顺序,后面的环能否拆下是以前面环的状态为先决条件的,因此要从后拆装到前)
      3.拆装当前环,并记录输出。


      IP属地:广东3楼2011-03-01 13:18
      回复
        九连环的算法大致伪代码描述……
        拆装(i)

          if i==1 then {直接拆装第i个环;记录;输出步骤;返回;}
          else
          {
            if a[i-1]未装上 then 拆装(i-1);
            for j = i-2 to 1
              if a[j]未拆下 then 拆装(j);
            直接拆装第i个环;记录;输出步骤;
          }

        main()

          for k = n to 1
            拆装(k);

        后来发现步骤还可以可以完善和简化点……
        1.是否不可以直接求解?
          递归调用自身解决子问题;
        2.解决自身;
        3.【递归解决后续问题】(比如汉诺塔)
        于是函数可以这样……
        拆装(i)

          if i>1 then
          {
            if a[i-1]未装上 then 拆装(i-1);
            for j = i-2 to 1
              if a[j]未拆下 then 拆装(j);
          }
          直接拆装第i个环;记录;输出步骤;

        


        IP属地:广东4楼2011-03-01 13:36
        回复
          关于深度优先搜索下次再码吧……先上课了


          IP属地:广东5楼2011-03-01 13:37
          回复


            IP属地:浙江6楼2011-03-01 14:15
            回复
              表示那个九连环已经快了……


              IP属地:广东8楼2011-03-03 12:41
              回复