链接列表中的最小值。递归结果不正确?

时间:2016-07-25 10:51:11

标签: c# algorithm recursion data-structures

试图了解一些概念。我试图在链接列表实现中的所有节点中找到最小值。我认为由于某种原因,我的代码返回所有递归返回值,而不是仅返回最后一个。有人可以查看我的findMin方法中的问题吗?

public class Node
{
    public int data;
    public Node next;
    public Node(int d)
    {
        data = d;
        next = null;
    }
}



public static int findMin(Node head,int min=0)
{
    if (min == 0)
        min = head.data;
    if (head.data < min)
    {
        min = head.data;
    }
    else
    {
        findmin(head.next, min);
    }
    return min;
}

3 个答案:

答案 0 :(得分:1)

findmin的递归调用的响应永远不会被分配给min。所以像min = findmin(head.next, min);那样调用它应该可以解决你的问题

答案 1 :(得分:1)

我相信它会让你回归第一个元素。或者有时会崩溃。

if (min == 0) min = head.data; //true initially. min=first element
if (head.data < min) //false. We just assigned it, it does not get executed
{
    min = head.data;
}
else
{
    findmin(head.next, min); //this gets executed but result is ignored
}
return min; // return head.data that you assigned in the first line

这很破碎。

  1. 你忘了将findmin(head.next,min)的结果分配给 任何

  2. 即使head.data&lt;你还需要检查其余部分 名单。所以&#34;否则&#34;不是必需的

  3. 您忘记检查列表是否为空

  4. 初始值应为int.MaxValue。不是0,而不是10000 以上建议。然后你不需要这个额外的比较(因为 任何东西都不到100000)

  5. 最好将递归调用放在最后让编译器(或JIT) 用循环替换尾递归。或者自己写一个循环。

  6. 这里应该是什么

    public static int findMin(Node head,int min=int.MaxValue)
    {
         if (head == null) return min;
         if (head.data < min) min = head.data;
         return findmin(head.next, min);
    }
    

答案 2 :(得分:0)

一些问题: 1.按值传递min 2. min初始化为0

试试这个

public static int findMin(Node cur) {
    if (cur == null) return 1000000;
    int next_min = findMin(cur.next)
    if (cur.data < next_min) return cur.data;
    return next_min;
}

最好不要在这里使用递归来保存stack内存。只需使用while循环并找到最小值。