这个功能有一些问题吗?
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).
还有其他问题吗?
欢迎任何评论.
谢谢
我已经看到很多搜索算法要在二进制排序树中搜索,但它们都使用相同的方式:递归.我知道递归是昂贵相比,循环,因为每次我们调用了搜索功能,对于那些方法,它最终会使用大量的内存,如果二叉搜索树太大创建一个新的堆栈帧.
为什么我们不能像这样搜索二叉搜索树:
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)
我认为这种方式比递归方式更快更有效,如果我错了,请纠正我!
问题:如何使用其他技术加速递归方法。
简单的斐波那契数列方法使用递归来输出输入的第 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) 如何使用尾递归在序言中实现展平列表?
这是带有简单递归的 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) 我正在尝试在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#教程,遇到了StackOverflowException.
叙述者使用下面的代码片段给出了这样一个例外的简洁例子,
public class Employee
{
private string _name;
public string Name
{
get{ return Name; }
}
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找C++和Java中这种类型的简单代码的一些示例,更具体地说是在javascript中可能导致Stack Overflow.
c ×3
recursion ×3
c++ ×2
java ×2
binary-tree ×1
c# ×1
javascript ×1
linux ×1
prolog ×1
stack ×1