试图了解一些概念。我试图在链接列表实现中的所有节点中找到最小值。我认为由于某种原因,我的代码返回所有递归返回值,而不是仅返回最后一个。有人可以查看我的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;
}
答案 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
这很破碎。
你忘了将findmin(head.next,min)的结果分配给 任何
即使head.data&lt;你还需要检查其余部分 名单。所以&#34;否则&#34;不是必需的
您忘记检查列表是否为空
初始值应为int.MaxValue。不是0,而不是10000 以上建议。然后你不需要这个额外的比较(因为 任何东西都不到100000)
最好将递归调用放在最后让编译器(或JIT) 用循环替换尾递归。或者自己写一个循环。
这里应该是什么
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
循环并找到最小值。