📜  Perl 中的递归

📅  最后修改于: 2022-05-13 01:55:43.216000             🧑  作者: Mango

Perl 中的递归

递归是函数一次又一次地调用自身直到满足所需条件的一种机制。当函数调用语句写在同一个函数内时,这样的函数称为递归函数。
传递给函数的参数是从默认数组@_ 中检索的,而每个值都可以通过 $_[0]、$_[1] 等访问。
示例 1:下面的示例查找数字的阶乘。

Factorial of any number n is (n)*(n-1)*(n-2)*....*1.
e.g.:
4! = 4*3*2*1 = 24
3! = 3*2*1 = 6
2! = 2*1 = 2
1! = 1
0! = 0

Perl
#!/usr/bin/perl
 
# Perl Program to calculate Factorial
sub fact
{
     
# Retrieving the first argument
# passed with function calling
my $x = $_[0];
 
# checking if that value is 0 or 1
if ($x == 0 || $x == 1)
{
    return 1;
}
 
# Recursively calling function with the next value
# which is one less than current one
else
{
    return $x * fact($x - 1);
}
}
 
# Driver Code
$a = 5;
 
# Function call and printing result after return
print "Factorial of a number $a is ", fact($a);


Perl
#!/usr/bin/perl
 
# Perl Program to print Fibonacci series
sub fib
{
    # Retrieving values from the parameter
    my $x = shift;
    my $y = shift;
     
    # Number till which the series is to be printed
    my $n = shift;
     
    # Check for the end value
    if ($y > $n)
    {
        return 1;
    }
     
    # Printing the number
    print " $y";
 
    # Recursive Function Call
    fib($y, $x + $y, $n);    
}
 
# Driver Code
 
# Number till which series is to be printed
$a = 5;
 
# First two elements of the series
$c = 0;
$d = 1;
 
print "$c";
 
# Function call with required parameters
fib($c, $d, $a);


这是该程序的工作原理:
步骤 1-当标量 a 的值为 0 或 1 时,函数将返回 1,因为两者的值都是 0!和1!是 1。
第 2 步 -当标量 a 的值为 2 时,fac(x-1) 调用 fac(1) 并且此函数返回 1。
所以,它是 2*factorial(1) = 2*1 = 2。所以,它会返回 2。
第 3 步- 类似地,当在每次调用时将较高的值传递给函数时,参数值减 1 并计算直到值达到 1。
示例 2:下面的示例计算斐波那契数列直到给定数字。

Perl

#!/usr/bin/perl
 
# Perl Program to print Fibonacci series
sub fib
{
    # Retrieving values from the parameter
    my $x = shift;
    my $y = shift;
     
    # Number till which the series is to be printed
    my $n = shift;
     
    # Check for the end value
    if ($y > $n)
    {
        return 1;
    }
     
    # Printing the number
    print " $y";
 
    # Recursive Function Call
    fib($y, $x + $y, $n);    
}
 
# Driver Code
 
# Number till which series is to be printed
$a = 5;
 
# First two elements of the series
$c = 0;
$d = 1;
 
print "$c";
 
# Function call with required parameters
fib($c, $d, $a);

这是该程序的工作原理:
第 1 步 -使用 3 个参数起始值调用函数fib(),起始值分别为 0 和 1,而 $n 是要打印系列的数字
第 2 步 -这些值以数组的形式传输,其值使用移位检索。
第 3 步- 在每次调用中,使用 shift 检索前两个值,并将这些值存储在标量 x 和 y 中。现在将这两个值相加以获得系列中的下一个值。此步骤一直持续到该值达到用户提供的结束值