当前位置:编程学习 > C#/ASP.NET >>

还有一道关于C语言算法的题,请各位高手帮忙分析~!

递归:求一个数组中N个整数的乘积
    int Getmultiply(int *pArray,int nCount)
    其中pArray为指向数组的指针,nCount为数组中元素的个数
    


    int Getmultiply(int *pArray,int nCount)
    {
    int nRet=0;
    if(2==nCount)
      nRet=pArray[0]*pArray[1];
    else
      nRet=pArray[0]*Getmultiply(pArray+1,nCount-1);
      return nRet;
    } 
对于其中的从int nRet=0;这步之后我没看懂,请各位高手帮忙分析一下!
非常感谢各位高手能帮小弟一下。。。。非常感谢各位!小弟敬候各位的详细分析,非常谢谢。。。 --------------------编程问答-------------------- if(2==nCount) 
      nRet=pArray[0]*pArray[1]; 
第归 到 2个元素时  返回相成

大于 2个时 

pArray+1 数组 指针加1
nCount-1 容量 减1
感觉 需要改一下

    int Getmultiply(int *pArray,int nCount) 
    { 
    int nRet=0; 
    if(2> nCount)
      return 1;
    else if(2==nCount) 
      nRet=pArray[0]*pArray[1]; 
    else 
      nRet=pArray[0]*Getmultiply(pArray+1,nCount-1); 
     return nRet; 
    } 








--------------------编程问答--------------------
    int Getmultiply(int *pArray,int nCount) 
    { 
    int nRet=0; 
    if(2> nCount)
      return pArray[0];
    else if(2==nCount) 
      nRet=pArray[0]*pArray[1]; 
    else 
      nRet=pArray[0]*Getmultiply(pArray+1,nCount-1); 
     return nRet; 
    } 
--------------------编程问答-------------------- 这么简单的事情也要做这么复杂,晕死

int Getmultiply(int* pArray, int nCount)
{
int nRet = 1;
for (int i = 0; i < nCount; i++)
{
nRet *= *pArray;
pArray++;
}
} --------------------编程问答-------------------- 楼主是属于递归的用法,3楼的同志用的循环,其实是一样的效果

 int Getmultiply(int *pArray,int nCount) 
    { 
    int nRet=0; //给计算结果赋初值0
    if(2==nCount) //当数组中只有2个数的时候直接相乘
      nRet=pArray[0]*pArray[1]; 
    else 
      nRet=pArray[0]*Getmultiply(pArray+1,nCount-1); 
       //3个以上递归相乘出结果,在调用Getmultiply()这个函数时必定会遇到nCount=2的时候,这时候循环就终止了,并返回了数值最终结果
    return nRet; //返回结果
    } 
--------------------编程问答-------------------- 需要考慮是否溢出,大數問題的計算啊

--------------------编程问答--------------------
引用 4 楼 megerisin 的回复:
楼主是属于递归的用法,3楼的同志用的循环,其实是一样的效果

int Getmultiply(int *pArray,int nCount)
{
int nRet=0; //给计算结果赋初值0
if(2==nCount) //当数组中只有2个数的时候直接相乘
nRet=pArray[0]*pArray[1];
else
nRet=pArray[0]*Getmultiply(pArray+1,nCount-1);
//3个以上递归相乘出结果,在调用Getmultiply()这个函数时必定会遇到nCount=2的时候,这时候循环就终止了,并返回了数值最终结果
return n…


复杂的事情简单化是程序员必须的素质,而简单的事情复杂化则是程序员的大忌。 --------------------编程问答--------------------
引用 6 楼 coconutyf 的回复:
引用 4 楼 megerisin 的回复:
楼主是属于递归的用法,3楼的同志用的循环,其实是一样的效果 

int Getmultiply(int *pArray,int nCount) 

int nRet=0; //给计算结果赋初值0 
if(2==nCount) //当数组中只有2个数的时候直接相乘 
nRet=pArray[0]*pArray[1]; 
else 
nRet=pArray[0]*Getmultiply(pArray+1,nCount-1); 
//3个以上递归相乘出结果,在调用Getmultiply()这个函数时必定会遇到nCount=2的时候,这时候循环就终…


同意~~ --------------------编程问答-------------------- 慎用递归。
n够大时可能会出现栈溢出~~ --------------------编程问答-------------------- 几个数乘用个循环就够了 --------------------编程问答-------------------- 对于megerisin 的回复和coconutyf 的回复我深表感谢!!!!
谢谢高手们的支招,及告知小弟一个程序员的能力和素质。。。
但我真的很想知道(megerisin 的回复):3个以上递归相乘出结果,在调用Getmultiply()这个函数时必定会遇到nCount=2的时候,这时候循环就终止了,并返回了数值最终结果 
这句话没有理解好!!!
能请megerisin 或其他高手再帮忙点拨一下,小弟不才,恳请各位再指点指点!!1
谢谢了。。。。 --------------------编程问答-------------------- 递归调用时,nRet=pArray[0]*Getmultiply(pArray+1,nCount-1); ,所以nCount会越来越小,直到nCount=2,递归结束,因为nCount=2时,不会执行else里的语句,当然就会执行到return nRet;所以整个递归算法就over了,结果就出来了啊。

递归算法的使用是有潜在危险的,若不能达成收敛,则会陷入死循环并导致溢出,因此递归的使用应该慎重,且应尽量使用成熟的递归算法,若没有必要应避免使用递归。 --------------------编程问答-------------------- 还是那句话,优秀的程序员应该是能够将复杂的问题简单化,而不是简单的问题复杂化,过分卖弄技巧的程序员是不可能成为一个优秀的程序员的。 --------------------编程问答-------------------- 受教了!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,