Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 提前退出递归函数时返回什么?_C_Recursion - Fatal编程技术网

C 提前退出递归函数时返回什么?

C 提前退出递归函数时返回什么?,c,recursion,C,Recursion,我有一个家庭作业,我需要计算两个字符串之间的编辑距离。我得到了最初的功能工作,但我一直有这个部分的问题 现在将截断添加到编辑距离中。这不会改变产生的结果,但会大大加快性能 以下是我的原始功能: static unsigned int compute_edit_distance(const char *const a, const char *const b) { if (strcmp(a, b) == 0) re

我有一个家庭作业,我需要计算两个字符串之间的编辑距离。我得到了最初的功能工作,但我一直有这个部分的问题

现在将截断添加到编辑距离中。这不会改变产生的结果,但会大大加快性能

以下是我的原始功能:

static unsigned int compute_edit_distance(const char *const a,
                                      const char *const b)
{
    if (strcmp(a, b) == 0) return 0;
    if (a[0] == '\0') return strlen(b);
    if (b[0] == '\0') return strlen(a);

    unsigned int remove_from_a =
        compute_edit_distance(a + 1, b) + 1;
    unsigned int remove_from_b =
        compute_edit_distance(a, b + 1) + 1;

    unsigned int remove_from_both =
        compute_edit_distance(a + 1, b + 1);
    if (tolower(a[0]) != tolower(b[0])) ++remove_from_both;

    return get_min(get_min(remove_from_a, remove_from_b),
               remove_from_both);
}
我试过一些方法,但都不管用。我最新的变化是

if (depth == MAX_EDIT_DISTANCE_DEPTH)
{
    size_t a_length = strlen(a);
    size_t b_length = strlen(b);
    size_t max_length = (a_length > b_length) ? a_length : b_length;
    return MAX_EDIT_DISTANCE_DEPTH + max_length;
}
使用新的函数签名

static unsigned int compute_edit_distance(const char *const a,
                                      const char *const b, unsigned int depth)
但这也不行


我能得到一个如何正确操作的提示吗?谢谢

最简单的方法是将“剩余深度”作为参数传入。也就是说,第一个调用传递了截止深度,所有递归调用传递了一个较小的数字,这由所做编辑的类型决定

基本思想是,在第一个解决方案中,在递归探索分支后计算深度。也就是说,所有呼叫都是在分支上进行的,然后在返回分支的过程中将号码相加

您仍然可以这样做来计算深度,但为了防止分支走得太远,您可以传入在分支下的调用中已经使用的编辑预算的运行总数,或者相当于剩余的编辑预算


您需要一些技巧从失败的分支传回一个数字,以确保该数字将被拒绝。例如,返回一个您知道会太大的数字,然后在最后检查结果。例如,返回MAX_DEPTH+1或类似值。

@user1416970一种情况,在这种情况下,您从递归函数中提前返回,因为您知道进一步递归不会得到任何结果。这必须做些什么。您是否正确地将“深度”传递给函数?原始代码是提供给您的还是您自己编写的?截止线应该做什么?(如果比较的深度已知,是否尝试退出比较?@MatinKh我编写了原始代码。如果比较的深度已知,我会尝试退出比较。@MatinKh当我说它不起作用时,我的意思是,当我使用任何一个截断实现时,结果都是不正确的。基本上,我应该按顺序打印出与另一个字符串编辑距离最小的字符串。如果没有截止,将打印正确的字符串。由于截断实现得不好,打印出了错误的字符串。我上面失败的解决方案做了类似的事情,但不是返回常量,而是取决于字符串的大小。(我认为大小可能会影响编辑距离。)我尝试将其更改为常量,但它会打印一组不同的错误值。您尚未向我们展示如何减少深度预算,这是关键部分。您返回的值与原始解决方案相比应该不会有太大变化。您所说的“减少深度预算”是什么意思?它是递归调用中的深度参数吗?我只是在深度上加了1。我尝试了你发布的方式。它会更改值,但不会更改为正确的值。我不认为深度预算是问题所在。我认为深度与我最初的算法不兼容。不知道换哪一个。