我用Python写了下面的两个函数:
def recur_tet(b, n):
if n == 1:
return(b)
else:
return(b ** recur_tet(b, n - 1))
def iter_tet(b, n):
ans = 1
for i in range(n):
ans = b ** ans
return(ans)
而且,令人惊讶的是,递归版本的速度要快一些:
python3> %timeit recur_tet(2,4)
1 µs ± 12.5 ns per loop
我开始学习ocaml,并且真正体会到了递归在语言中的威力。然而,我担心的一件事是堆栈溢出。
如果ocaml使用堆栈进行函数调用,它最终不会溢出堆栈吗?例如,如果我有以下函数:
let rec sum x =
if x > 1 then f(x - 1) + x
else x;;
它最终一定会导致堆栈溢出。如果我在c++中做同样的事情(使用递归),我知道它会溢出。
所以我的问题是,有没有内置的保护措施来防止函数式语言溢出堆栈?如果不是,它们是不是像这样不太有用,因为上面的求和算法是用for循环的过程化风格编写的,可以处理任何数字(与整数溢出无关)?
我有以下语法,我需要将它转换为LL(1)语法
G = (N; T; P; S) N = {S,A,B,C} T = {a, b, c, d}
P = {
S -> CbSb | adB | bc
A -> BdA | b
B -> aCd | ë
C -> Cca | bA | a
}
关键是,我知道当这只是一部作品时如何转换,但我在互联网上找不到任何明确的方法来解决这个问题。
提前感谢!
所以这是我程序的一部分。当我为相差超过250000的数字调用bound时,它会导致堆栈溢出。我该如何解决这个问题呢?对于较小的输入,该程序运行良好。我很确定程序的其余部分都很好。有没有办法重写函数,让它们正常工作?我不喜欢使用for while循环。谢谢
let rec sqdigits a =
if a = 0 then 0
else ( a mod 10)*( a mod 10) + sqdigits (a/10);;
let rec bound c d =
if c>d then []
else (sqdigits (c))::(bound (c+1) d);;
我需要帮助理解这个查询的递归部分:
WITH EmpsCTE AS
(
SELECT empid, mgrid, firstname, lastname
FROM HR.Employees
WHERE empid = 2
UNION ALL
SELECT C.empid, C.mgrid, C.firstname, C.lastname
FROM EmpsCTE AS P
JOIN HR.Employees AS C
ON C.mgrid = P.empid
)
SELECT empid, mgrid
我必须计算以下语法的第一组和第二组:
A -> B C
B -> A x | x
C -> y C | y
根据我的理解,我得到了以下计算:
首先,我们删除左递归。
A -> B C
B -> x B'
B' -> C x B' | ε
C -> y C | y
Follow (A) = {$}
但在书中,Follow (A) = {x,$}的答案
为什么?他们没有删除左递归吗?
我正在试图弄清楚如何有效地计算出所有可以作为某个集合的线性组合产生的数字,比如前几个丰富的数字(12,18,20,24)。问题是我现在想要处理的方法是遍历所有的数字a*12+b*18+c*20+d*24,其中和不超过100。现在我想到了两种方法。一个多重嵌套的while循环或一个while循环,它基于while循环顶部的条件递增不同的内容。我对这两种方法的问题是,我不知道在运行之前我需要多少条件或嵌套循环,因为我还不知道我将对多少不同的数字求和。有没有办法让我的程序对n个数嵌套n次,或者对n个数有n个条件。
以下是开关块的轮廓:
int count=1;
while(true){
if
我在学习递归的时候遇到了这个问题:
FORTRAN implementations do not permit recursion because
a. they use static allocation for variables
b. they use dynamic allocation for variables
c. stacks are not available on all machines
d. it is not possible to implement recursion on all machines.
我发现答案是(a)
但我想知道一种编程语言支持递归应该
哪种方法在现实世界中最流行:递归还是迭代?
例如,具有递归的简单树前置遍历:
void preorderTraversal( Node root ){
if( root == null ) return;
root.printValue();
preorderTraversal( root.getLeft() );
preorderTraversal( root.getRight() );
}
对于迭代(使用堆栈):
Push the root node on the stack
While the stack is not empty
Pop a no
编辑:感谢大家。我刚接触这门语言(两天前才开始使用),所以这就是我不熟悉conds的原因。如果我有时间,我可能会重写它,但我只是想确保我的基本逻辑是正确的。再次感谢!
我的任务是创建一个尾递归函数,它从列表中删除第n个元素,1 <= n <= list list,只有两个参数,list x和元素n。所以,(remove 1 '(a B C d))将返回(b C d)。我写了以下代码,希望能保证它确实是尾递归的。我唯一不确定的是递归调用是否可以嵌套在if语句中。
(define (remove n x)
; if n is 1, just return the cdr
我使用切片进行快速排序的代码--
* def分区(A):
length=len(a)
c=0
piv=a[0]
#print(piv)
for i in range(0,length):
if a[i]<piv:
c+=1
a[c],a[0]=a[0],a[c]
piv=c
a[piv]
i=0
j=length-1
while i<j:
if a[i]<a[piv]:
i=i+1
当我在JS中有几个接受参数和返回值的链式函数时,这个依赖是什么,我如何打破它?
示例
function a (arg1){
return res1;
}
function b (arg2){
function a(arg1);
return res2;
}
function c (arg3){
function b(arg2);
return res3;
}
c(arg3);