这个功能有一些问题吗?
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).
还有其他问题吗?
欢迎任何评论.
谢谢
我使用valgrind来找出堆栈方向的混乱问题.
看下面的代码,我想知道为什么运算符"p1 + = 0x80;*p1 = 1"有效且运算符"p2 - = 0x80;*p2 = 1"根据valgrind无效写入?
我认为所有的变量都根据操作系统在堆栈中分配,并且它正在增长到较低的地址,所以我认为" - ="是有效的,而"+ ="是无效的,因为它可能比较大到堆栈顶部可能不在堆栈限制中.
#include <stdlib.h>
int main()
{
int a;
int *p1 = &a;
p1 += 0x80;
int *p2 = &a;
*p1 = 1;
p2 -= 0x80;
*p2 = 1;
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud) 如本教程中所述:http: //www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/
在计算机编程中,堆栈是容纳其他变量的容器(很像数组).但是,虽然数组允许您以任何顺序访问和修改元素,但堆栈更受限制.可以在堆栈上执行的操作与上面的操作相同:
1)查看堆栈中的顶部项目(通常通过名为top()的函数完成)2)从堆栈中取出顶部项目(通过名为pop()的函数完成)3)在顶部放置一个新项目堆栈(通过名为push()的函数完成)
但是如果我在C++中定义了两个变量,我就不必按照相同的定义顺序使用它们:
例:
int main() {
int a;
int b;
b = 5;
a = 6;
}
Run Code Online (Sandbox Code Playgroud)
这段代码有问题吗?我可以按照我喜欢的任何顺序使用它们!我不必先使用a,然后使用b.
我误会了什么吗?它是什么?
我一直在阅读和阅读堆栈,但我仍然不知道如何在现实世界的编程中使用它!我知道这是一个LIFO数据结构,但我怎样才能从中受益?我知道POP和PUSH功能,但那又怎样?
有代码:
struct FooBar
{
FooBar()
{
MyObject obj;
/// when c-tor is ended, obj must be deleted through d-tor call
}
};
...
FooBar* fooBar(new FooBar);
Run Code Online (Sandbox Code Playgroud)
fooBar在堆上分配.但是对象MyObject obj里面FooBar的构造函数不知道它的创建位置.那么可以在被处理MyObject的上下文中实例化FooBar它就像在堆栈中创建的那样?
堆上分配的对象是否有自己的堆栈?这种堆栈的大小是多少?
我在这里遇到一些问题.每次我运行下面的代码,我的程序都会崩溃.
void Wingcod::push(byte b)
{
stack[stackp] = b;
stackp++;
if(stackp >= stacks)
{
stacks += 16;
try
{
realloc(stack,stacks);
}catch(bad_alloc*)
{
cerr << "STACK OVERFLOW";
exit(1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈,堆栈和堆栈的定义如下:
stacks = 8;
stackp = 0;
stack = new byte[stacks];
Run Code Online (Sandbox Code Playgroud)
而字节只是一个unsigned char.
每当Apple创建自己的自定义类时,它通常会创建一个指向对象的指针,而不是实际的对象本身.
例如,而不是做:
Class object
Run Code Online (Sandbox Code Playgroud)
他们经常这样做:
Class *object = [[Class alloc] init];
Run Code Online (Sandbox Code Playgroud)
为什么指针如此常用而不是将对象放在堆栈上?是否有一些技术原因,因为我没有看到这样做的任何直接好处.
编辑:如果Objective-C不支持堆栈上的对象,他们怎么能创建任何非指针?我的意思是我见过人们直接使用NSInteger.
如果这个代码在多个内核上运行多个线程没有任何性能优势,我就不会感到头疼.但它怎么能真正运行得慢?
首先看一下代码:
class ThreadSafeStack
def initialize
@s,@m = [],Mutex.new
end
def push(value)
@m.synchronize { @s.push(value) }
end
def pop
@m.synchronize { @s.pop }
end
def peek
@m.synchronize { @s.last }
end
end
Run Code Online (Sandbox Code Playgroud)
完整的基准测试脚本位于https://github.com/alexdowad/showcase/blob/master/ruby-threads/concurrent_stack.rb.基本上,我做了一百万次推送,一百万次偷窥和一百万次流行音乐,分为1个,5个或25个线程(并行运行).
运行JRuby 1.6.5.1的4核Mac Pro的结果:
Testing ThreadSafeStack with 1 thread, iterating 1000000x each
1.575000 0.000000 1.575000 ( 1.575000)
Testing ThreadSafeStack with 5 threads, iterating 200000x each
4.838000 0.000000 4.838000 ( 4.838000)
Testing ThreadSafeStack with 25 threads, iterating 40000x each
11.409000 0.000000 11.409000 ( 11.409000)
Run Code Online (Sandbox Code Playgroud)
是什么赋予了??? …
据我所知,这不是由无限递归引起的.
该程序使用较小的数组(它是一个音频编辑器)正常运行.现在我增加了功能以允许更大的阵列(最多5分钟的音频,26460000个16位数据~50mb).
由于增加了数组的大小,我在一个特定的函数上收到堆栈溢出错误,它应该通过向后将数组写入新数组来反转输入文件的回放,然后覆盖原始数组.我猜测每个阵列可能高达50MB,这可能是问题所在:
//initialise temporary new array to place samples in
short signed int reverse_data[max_number_samples];
for (i=0; i<track_samples; i++)
{ //puts data from sound_data into reverse_data backwards.
reverse_data[(max_number_samples-1)-i]=sound_data[i];
}
for (i=0; i<track_samples; i++)
{ //now overwrites sound_data with the data in reverse_data
sound_data[i]=reverse_data[i];
}
Run Code Online (Sandbox Code Playgroud)
我对C++和编程很新,并且不确定我在调试期间得到的错误是什么告诉我的.
任何帮助将不胜感激,我确信有一个简单的解决方案(我读过涉及'堆'的东西,但我不确定'堆'真的是什么).