Recursion 理解递归

Recursion 理解递归,recursion,Recursion,我正在努力理解动态编程示例中使用的递归。有人能解释一下这个工作原理吗。目标是为一个值找到最少数量的硬币 //f(n)=1+min f(n-d) 伪代码: int memo[128]; //initialized to -1 int min_coin(int n) { if(n < 0) return INF; if(n == 0) return 0; if(memo[n] != -1) int ans = INF; for(int i = 0; i <

我正在努力理解动态编程示例中使用的递归。有人能解释一下这个工作原理吗。目标是为一个值找到最少数量的硬币

//f(n)=1+min f(n-d)

伪代码:

int memo[128]; //initialized to -1

int min_coin(int n)
{
   if(n < 0) return INF;
   if(n == 0) return 0;
   if(memo[n] != -1)

   int ans = INF;
   for(int i = 0; i < num_denomination; ++i)
   {
      ans = min(ans, min_coin(n - denominations[i]));
   }
   return memo[n] = ans+1; //when does this get called?

}
int memo[128]//初始化为-1
国际货币(国际货币)
{
如果(n<0)返回INF;
如果(n==0)返回0;
如果(备注[n]!=-1)
int ans=INF;
对于(整数i=0;i
Topcoder在这篇文章中很好地解释了这个特殊的例子

基本上,这种递归是使用较小问题的解决方案(较小n的硬币数最少)来找到整个问题的解决方案。这方面的动态规划是子问题解决方案的核心,因此它们不必每次都重新计算


是的,正如ring0在他的评论中提到的那样,缺少了{},只有在子问题以前没有解决的情况下,才应该执行递归。

要回答所有者的问题,什么时候调用它?:在基于递归程序的解决方案中,相同的函数本身被调用。。。但最终还是回来了。。。什么时候回来?从函数停止调用自身时起

f(a) {
  if (a > 0) f(a-1);
  display "x" 
}

f(5);
f(5)
会调用f(4),依次调用f(3)调用f(2),后者调用f(1)调用f(0)


f(0)
a
为0,因此它不调用
f()
,并显示“x”,然后返回。它返回到上一个
f(1)
,在调用
f(0)
-done-之后,它也显示“x”<代码>f(1)结束,f(2)显示“x”,直到f(5)。从ring0已经提到的另一个术语来看,当程序到达基本情况并开始向上展开堆栈(调用帧)时,您会得到6“x”。

。对于类似情况,请使用


一些
{}
if(memo[n]!=-1)
之后丢失?我不知道如何更正它。这里给出了一个例子
#!/usr/bin/env  perl

use strict;
use IO::Handle;
use Carp qw(cluck);

STDOUT->autoflush(1);
STDERR->autoflush(1);

sub factorial {
    my $v = shift;

    dummy_func();
    return 1 if $v == 1;
    print "Variable v value: $v and it's address:", \$v, "\ncurrent sub factorial addr:", \&factorial, "\n","-"x40;
    return $v * factorial($v - 1);
}

sub dummy_func {
    cluck;
}

factorial(5);