相关疑难解决方法(0)

是否可以通过使用递归函数使堆栈溢出?

这个功能有一些问题吗?

 unsigned long factorial(unsigned long m)
 {
     return (m == 0) ? 1 : m * factorial(m - 1);
 }
Run Code Online (Sandbox Code Playgroud)

如果我添加另一个功能:

  int myCombina(int q, int p)
  {
      return factorial(q) / ( factorial(q) * factorial(q-p) );
  }
Run Code Online (Sandbox Code Playgroud)

这个myCombina()效率不高,因为应该取消最大公约数以找到组合.

max(factorial(q),factorial(qp))可以被取消.我们只需要计算qx(q-1)... x(q -k +1).

还有其他问题吗?

欢迎任何评论.

谢谢

c c++ stack-overflow recursion stack

0
推荐指数
1
解决办法
231
查看次数

什么是搜索二叉搜索树的最有效方法?

我已经看到很多搜索算法要在二进制排序树中搜索,但它们都使用相同的方式:递归.我知道递归是昂贵相比,循环,因为每次我们调用了搜索功能,对于那些方法,它最终会使用大量的内存,如果二叉搜索树太大创建一个新的堆栈帧.

为什么我们不能像这样搜索二叉搜索树:

while (root!=NULL)
{
    if (root->data==data)
        return 0;
    else if (data > root->data)
        root=root->right;
    else
        root=root->left;
}
Run Code Online (Sandbox Code Playgroud)

我认为这种方式比递归方式更快更有效,如果我错了,请纠正我!

c binary-tree binary-search binary-search-tree

0
推荐指数
1
解决办法
247
查看次数

如何提高 Java 递归的速度

问题:如何使用其他技术加速递归方法。

简单的斐波那契数列方法使用递归来输出输入的第 N 个数字。

任何建议都会很棒,谢谢。

前任; 输入 50 需要将近一分钟才能最终获得输出。

编辑:更改问题文本,因为它不是递归太慢,而是我的代码。

public static long cycle(int x) {
  if(x<=1) {
    return x;
  } else {
    return cycle(x-1)+cycle(x-2);
  }
}
Run Code Online (Sandbox Code Playgroud)

java recursion

0
推荐指数
1
解决办法
1278
查看次数

如何使用尾递归在序言中实现展平列表?

如何使用尾递归在序言中实现展平列表?

这是带有简单递归的 flatten/2 代码(即没有回溯的意思):

flatten([], []).
flatten([L|Ls], FlatL) :-
    !,
    flatten(L, NewL),
    flatten(Ls, NewLs),
    append(NewL, NewLs, FlatL).
flatten(L, [L]).

?- flatten([1, [2,3], [4]], X).
X=[1,2,3,4].
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用尾递归(累加器)执行相同的算法。例如,谓词sum/2返回列表中所有成员的相加,并带有回溯:

sum([X],[X]).
sum([H|T],S) :- sum(T,S1), S is H + S1 .
Run Code Online (Sandbox Code Playgroud)

与尾递归相同的算法是

sum1(L,S) :- sum1(L,0,S).

sum1([],Acc,Acc).
sum1([H|T],Acc,S) :- Acc1 is Acc+H, s(T,Acc1,S).
Run Code Online (Sandbox Code Playgroud)

tail-recursion prolog

-1
推荐指数
1
解决办法
1864
查看次数

为什么两个函数中的C程序在Linux上递归调用会产生分段错误?

我正在尝试在Linux上编译以下C代码:

#include <stdio.h>
/////
void func1();
void func2();
//////
void func1()
{
  func2();
}
void func2()
{
  func1();
}
int main()
{
  func1();//call to function 1
}
Run Code Online (Sandbox Code Playgroud)

如果我没有记错的话,该程序应该无限执行,但是当我在Linux上编译并运行它时,就会出现Segmentation Fault。为什么会这样呢?

c linux recursion

-1
推荐指数
1
解决办法
65
查看次数

在C#,C++和Java中导致堆栈溢出的最简单方法

我正在看一个C#教程,遇到了StackOverflowException.

叙述者使用下面的代码片段给出了这样一个例外的简洁例子,

public class Employee
{
    private string _name;

    public string Name
    {
       get{ return Name; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找C++和Java中这种类型的简单代码的一些示例,更具体地说是在javascript中可能导致Stack Overflow.

javascript c# c++ java

-3
推荐指数
2
解决办法
874
查看次数