我正在观看有关CUDA和Barnes-Hut算法的视频,其中声称有必要对GPU的树放置深度限制,然后想法可能会在堆中进行递归.
基本上,我只是想知道:是否有可能从堆中分配内存并将其用作临时"堆栈",在该堆栈中对有问题的递归函数进行函数调用以稍微延迟堆栈溢出?
如果是这样,如何实现,我们是否会为指向函数的指针分配空间?我假设它会涉及在堆中存储函数地址但是我不太确定.
[编辑]我只是想补充一点,这纯粹是一个理论问题,我想这样做会导致程序在使用堆时减慢速度.
[编辑]根据请求,我使用的编译器是Ubuntu 14.04(64位)上的GCC 4.8.4
对于赋值,我们需要编写除法算法,以便仅使用加法和递归来完成某个问题.我发现,在不使用尾递归的情况下,天真的重复减法实现很容易导致堆栈溢出.所以快速分析这个方法,如果我错了就纠正我,这表明如果你将A除以B,分别用n和m二进制数,它应该是以nm为指数.我真的得到了
O( (n-m)*2^(n-m) )
Run Code Online (Sandbox Code Playgroud)
因为需要为了在n位数字下降到的n-1位的数字从n个二进制位的数字减去一个m二进制位数2 ^(nm)的倍,则需要执行此纳米次以得到一个数字在重复减法除法中最多有m个数字,因此运行时应该如上所述.再说一次,我很可能是错的,所以有人请你纠正我,如果我.这是假设O(1)加法,因为我正在使用固定大小的整数.我想用固定大小的整数可以说算法是O(1).
回到我的主要问题.我开发了一种不同的方法来执行整数除法,即使在递归地使用它时,它也可以更好地工作,基于for的想法
P = 2^(k_i) + ... 2^(K_0)
我们有
A/B = (A - B*P)/B + P
Run Code Online (Sandbox Code Playgroud)
该算法如下进行A/B:caclulate :
input:
A, B
i) Set Q = 0
ii) Find the largest K such that B * 2^K <= A < B * 2(K + 1)
iii) Q -> Q + 2^K
iv) A -> A - B * 2^k
v) Repeat steps ii) through iv) until A <= B
vi) Return Q …Run Code Online (Sandbox Code Playgroud) 我在从字符串和整数列表中仅删除字符串时遇到麻烦。这看似愚蠢,但这是事实:
>>> A = [1, '2', '3', 4, '5', '4', 6, 56, 7, '4', 6, '543']
>>>
>>> for i in A:
if type(i) is str:
A.remove(i)
>>> A
[1, '3', 4, 6, 56, 7, '4', 6]
Run Code Online (Sandbox Code Playgroud)
是否有人对正在发生的事情有任何想法,或者我只是做错了什么?