c语言递归函数怎么写( 四 )


如此循环,当地址加到字符串的结束标志符'\0'时,递归停止 。当然,同样是利用递归,还有人写出了更加简洁的代码:intmy_strlen( const char* strDest ){ return *strDest?1+strlen(strDest+1):0;}这里很巧妙的利用了问号表达式,但是没有做参数入口校验,同时用*strDest 来代替('\0'== *strDest)也不是很好 。
所以,这种写法虽然很简洁,但不符合我们前面所讲的编码规范 。可以改写一下:intmy_strlen( const char* strDest ){ assert(NULL != strDest); return ('\0' != *strDest)?(1+my_strlen(strDest+1)):0;}上面的问题利用函数递归的特性就轻易的搞定了,也就是说每调用一遍my_strlen 函数,其实只判断了一个字节上的内容 。
但是,如果传入的字符串很长的话,就需要连续多次函数调用,而函数调用的开销比循环来说要大得多,所以,递归的效率很低,递归的深度太大甚至可能出现错误(比如栈溢出) 。所以,平时写代码,不到万不得已,尽量不要用递归 。
即便是要用递归,也要注意递归的层次不要太深,防止出现栈溢出的错误;同时递归的停止条件一定要正确,否则,递归可能没完没了 。
9.c语言里递归函数怎么用啊奉上pascal汉诺塔程序代码,我没有学C 。
只学了pascal 。
目前在深入学习算法 。
汉诺塔是个很典型的递归,是考验程序员的归纳能力的 [*]program hannuota;//汉诺塔游戏[*]var[*]panzi :integer;[*]procedure move(n,a,b,c : integer);[*]begin[*]if n = 1 then[*]write(a,' to ',c)[*]else begin[*]move(n-1,a,b,c);[*]writeln(a,' to ',c);[*]move(n-1,b,a,c);[*]end;[*]end;[*]begin[*]writeln('please write a number of the number of panzi');[*]read(panzi);[*]move(panzi,1,2,3);[*]readln;[*]readln;end. 。

c语言递归函数怎么写

文章插图