【问题标题】:Need help giving a recursive definition需要帮助给出递归定义
【发布时间】:2013-12-20 15:58:50
【问题描述】:

给定n个无序整数序列,S = a1,a2,a3...

给出关于 n 的最长非递减子序列长度的正式递归定义。

所以,我的想法是,如果我们递归定义它,那么序列中的每个整数都是长度为 1 的序列,并且包含长度为 1 的非递减子序列。这是否是正确的说法还是我完全不在了?

【问题讨论】:

  • 通过“最长的非递减子序列”,您是否只考虑以下整数的子序列?或者您是否可以根据需要重新排序? (我猜你不是,这太容易了!)
  • @Theox 只能跟随整数,不允许重新排序。
  • 这不是直接从动态规划解到最长非递减子序列问题吗?

标签: algorithm recursion sequence


【解决方案1】:

我已经想到了这个解决方案。我用伪代码写的。

define function non_decreasing_subsequence (index, sub_sequence, initial_sequence )
{
    sub_sequence.add(index)

    if initial_sequence[index+1] is not defined
        return lenght of sub_sequence

    if initial_sequence[index] <= initial_sequence[index+1]
        call non_decreasing_subsequence (index+1, sub_sequence, initial_sequence)
    else 
        return lenght of sub_sequence
}

for i between 1 and lenght of initial_sequence
    call non_decreasing_subsequence (i, empty_sequence, initial_sequence)

您将通过这种方式计算以下整数的每个非递减子序列的长度。现在您可以最大限度地利用这些长度!

【讨论】:

  • 如果被否决,我想解释一下我的回答有什么不好。在此先感谢:)
【解决方案2】:

除了你所在的元素之外,在你的递归中还有两个变量可能会更好。一个具有历史最大值,一个具有当前上升元素的长度。如果数组有元素,你保证为 1 并计数直到下一个元素递减,那么你可能会以一个新的历史最大值重新开始,或者列表在最后你返回当前长度的最大值和历史最大值。

类似这样的 Scheme 实现?

(define (longest-increasing-sequence lst)
  (if (null? lst)
      0
      (let recur ((lst lst) (cur 1) (hmax 0))
        (cond ((null? (cdr lst)) (max hmax cur))
              ((<= (car lst) (cadr lst)) (recur (cdr lst) (+ cur 1) hmax))
              (else (recur (cdr lst) 1 (max hmax cur)))))))

这是一个使用数组而不是链表的 PHP 版本:

function longest_increasing_sequence($lst)
{
    $stop = count($lst)-1;
    if( $stop < 0 )
        return 0;

    // makes an anonymous function closed over &$lst, $stop and &$recur
    $recur = function( $idx, $cur_len, $max_len ) use (&$lst, $stop, &$recur)
             {
                 $new_idx=$idx+1;

                 if( $idx == $stop )
                     return max($cur_len, $max_len);
                 elseif( $lst[$idx] <= $lst[$new_idx] )
                     return $recur($new_idx, $cur_len + 1, $max_len);
                 else
                     return $recur($new_idx, 1, max($cur_len, $max_len));
             };

    // start recursion
    return $recur(0, 1, 0);
}

【讨论】:

  • Scheme 对于不熟悉它的任何人来说都难以理解,因此无法回答非 Scheme 问题。
  • @Dukeling 问题没有用任何语言标记,但为了完整起见,我还添加了一种 Algol 方言 (PHP)。
【解决方案3】:

纯递归:

-module(lndss).

-export([get_len/1]).

get_len([]) -> 0;
get_len([H|T]) -> get_len(H, T, 1, 1).

get_len(_, [], C, M) -> max(C, M);
get_len(P, [H|T], C, M) when H < P -> get_len(H, T, 1, max(C, M));
get_len(_, [H|T], C, M) -> get_len(H, T, C+1, M).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多