首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化递归函数

简化递归函数
EN

Stack Overflow用户
提问于 2015-12-07 16:49:32
回答 1查看 123关注 0票数 1

当我围绕recursion绞尽脑汁的时候,我希望能用以下简单的问题来更好地理解递归本身,同时也本着TIMTOWTDI的精神去达到我的目标。

问题很简单,考虑到复杂的Perl数据结构,$cds (保证从HASH开始,嗯,它有区别吗?),我希望遍历$cds并删除单层数组。

我从下面开始,效果很好.

代码语言:javascript
复制
sub reduce_1level
{
    my $cds = shift;

    if (ref $cds eq 'HASH')
    {
        foreach my $key (keys %$cds)
        {
            if (ref $cds->{$key} eq 'ARRAY')
            {
                if (@{$cds->{$key}} == 1)
                {
                    $cds->{$key} = $cds->{$key}[0];
                }
                else
                {
                    reduce_1level ($cds->{$key});
                }
            }
            elsif (ref $cds->{$key} eq 'HASH')
            {
                reduce_1level ($cds->{$key});
            }
        }
    }
    elsif (ref $cds eq 'ARRAY')
    {
        foreach (@$cds)
        {
            reduce_1level ($_) if ref;
        }
    }
}

..。但我觉得代码可以更简单更短。在对类似问题进行针刺之后,我修改为:

代码语言:javascript
复制
sub reduce_1level
{
    my $cds = shift;

    if (ref $cds eq 'ARRAY')
    {
        foreach (@$cds)
        {
            reduce_1level ($_) if ref;
        }
    }
    elsif (ref $cds eq 'HASH')
    {
        foreach my $key (keys %$cds)
        {
            if (ref $cds->{$key} eq 'ARRAY' and @{$cds->{$key}} == 1)
            {
                $cds->{$key} = $cds->{$key}[0];
            }
            next unless ref $cds->{$key};
            reduce_1level ($cds->{$key});
        }
    }
}

我想知道还有什么更好的方法可以达到缩进的目标吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-07 17:45:05

忘了复杂性吧。这甚至都不正确。

有些调用处理两个级别的数据结构,因此您应该有重复的代码。因此,以下中的所有单元素数组都不会被消除:

代码语言:javascript
复制
{ foo => [ [ 3 ] ] }

不要试图在同一个调用中处理两个级别。

代码语言:javascript
复制
sub reduce_1level {
    our $cds; local *cds = \shift;   # alias $cds = shift;

    my $reftype = ref($cds)
        or return;

    if ($reftype eq 'HASH') {
        reduce_1level($_) for values %$cds;
    }
    elsif ($reftype eq 'ARRAY') {
        if (@$cds == 1) {
            $cds = $cds->[0];
            reduce_1level($cds);
        } else {
            reduce_1level($_) for @$cds;
        }
    }
    else {
        die("Unsupported reference type $reftype\n");
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34138845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档