Recursion 理解递归
我正在努力理解动态编程示例中使用的递归。有人能解释一下这个工作原理吗。目标是为一个值找到最少数量的硬币 //f(n)=1+min f(n-d) 伪代码: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 <
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);