+ -
当前位置:首页 → 问答吧 → 递归算法

递归算法

时间:2011-03-28

来源:互联网

大家好:
   想学习点算法的知识。不过马上被递归的算法搞迷了。不知道函数该如何调用自身。
我想做个最简单的阶乘。1*2*3.。。。*10. 做和10的阶乘。  程序运行出差。怎么改改?

my $n = 10;
my $result = DiGui($n);
print "$result\n";


sub DiGui{
    my $receive = @_;
    if ($receive == 1) {
       return 1;
    }
    else {
    return $receive * DiGui($receive - 1);
    }
}

作者: leigh111   发布时间: 2011-03-28

my $receive = @_; 这里取参数的时候错了,用 my $receive = shift @_; 就可以了

作者: zhlong8   发布时间: 2011-03-28

本帖最后由 leigh111 于 2011-03-28 14:58 编辑

改成my $receive = shift @_; 就对了。

不过我不明白:因为函数DiGui只有一个参数,  
my $receive = shift @_; 和 my $receive = @_;  有什么区别? 其实 $receive接收的都是 10啊。

作者: leigh111   发布时间: 2011-03-28



QUOTE:
改成my $receive = shift @_; 就对了。

不过我不明白:因为函数DiGui只有一个参数,  
my $receive = s ...
leigh111 发表于 2011-03-28 14:54




my $receive = shift @_;  #这里$receive 得到的是传进函数的第一个参数
my $receive = @_; #这里$receive 得到的是传进函数参数的个数

作者: xfoucs   发布时间: 2011-03-28

能给讲讲这个程序 是怎么运行的吗?  不管参数是个数,还是第一个参数。 但它就一个参数,你把它说成10个也行,你把它说成第一个参数也行。 它就是10;这里的shift 我真不知道有什么用?

作者: leigh111   发布时间: 2011-03-28



QUOTE:
能给讲讲这个程序 是怎么运行的吗?  不管参数是个数,还是第一个参数。 但它就一个参数,你把它说成10个也 ...
leigh111 发表于 2011-03-28 15:48



shift 就是移除数组的第一个元素,操作一次数组就少一个元素
这个递归函数就一个参数,你写成 my ($receive)=@_; 也可以
你要写成 my $receive=@_; 那$receive永远是参数个数1

作者: xfoucs   发布时间: 2011-03-28

恩。 反应过来了。你说的对。不过这个程序自身调用。还是有点糊涂。 慢慢琢磨吧。

谢谢您。

作者: leigh111   发布时间: 2011-03-28

本帖最后由 昭襄王 于 2011-03-28 16:33 编辑

perl最讲究的是“语境”二字。
子过程DiGui接受的参数是一个数组,即便只有一个元素,也是个数组!
用shift @_就把这个数组的第一个元素抛出来了,具体到你的这个题目就是把数组里面唯一的元素取出了。根据这个,你的代码也可以改写成这样:
  1. #! /usr/bin/perl -w
  2. my $n = 10;
  3. my $result = DiGui($n);
  4. print "$result\n";

  5. sub DiGui{
  6.     my $receive = $_[0];
  7.     if ($receive == 1) {
  8.        return 1;
  9.     }
  10.     else {
  11.     return $receive * DiGui($receive - 1);
  12.     }
  13. }
复制代码
当然,perl可以使用三元运算,所以可以简化成这样:
  1. #! /usr/bin/perl -w
  2. my $n = 10;
  3. my $result = DiGui($n);
  4. print "$result\n";

  5. sub DiGui{
  6.         return ($_[0] == 1) ? 1 : $_[0] * DiGui($_[0] - 1);
  7. }
复制代码

作者: 昭襄王   发布时间: 2011-03-28

一般我都这样用....


sub DiGui{
    my ($receive) = @_;

    return 1 if ($receive == 1);

    return $receive * DiGui($receive - 1);
}

当你后来又想到要加一个参数时....

DiGui(10);        # 一样是 =  10 * 9 * ... * 2 * 1
DiGui(10, 6);    # =10 * 9 * ..  * 6

    my ($receive, $end) = @_;

    return 1 if ($receive == 1);

    return $end if ($receive == $end);

    return $receive * DiGui($receive - 1);

作者: jason680   发布时间: 2011-03-28